Set up

#loading packages
library(tidyverse)
library(readxl)
library(forcats)
library(RColorBrewer)
library(knitr)
library(kableExtra)
library(purrr)
library(lme4)
library(lmerTest)
library(emmeans)
library(gtsummary)

levels_type <- c("Ordinary", "Scientific", "Supernatural", "Fictional")
levels_country <- c("US", "Ghana", "Ecuador", "Peru")
#loading data 
df_raw <- read_excel(path = "ontology_data.xlsx")
#making some modifications

df <- df_raw %>%
  mutate(ont_ctry_name = case_when(
    ont_ctry == 1 ~ "US",
    ont_ctry == 4 ~ "Ghana",
    ont_ctry == 7 ~ "Peru",
    ont_ctry == 6 ~ "Ecuador",
    TRUE ~ NA_character_ 
  )) %>%
  relocate(ont_ctry_name, .before = everything())

Data Wrangling

#df_sens requires sensory_vars, which is created in the custom_functions.R file

# Combine into one big df_sens
df_sens <- reduce(sensory_vars, left_join, by = "ont_subj")

# Rejoin metadata
df_sens <- df %>%
  select(ont_subj, ont_ctry_name, ont_version) %>%
  left_join(df_sens, by = "ont_subj")

# df_usens requires usens_vars, which is created in the custom_functions.R file

# Combine into one big df_sens
df_usens <- reduce(usens_vars, left_join, by = "ont_subj")

# Rejoin metadata
df_usens <- df %>%
  select(ont_subj, ont_ctry_name, ont_version) %>%
  left_join(df_usens, by = "ont_subj")
# Note that this is the data frame in which many important variables are calculated, including the consensus score 
df_ext_long <- df %>% 
  filter(ont_ctry_name %in% c("US", "Ghana", "Ecuador", "Peru")) %>%
  select(ont_ctry_name, ont_subj,
         sci_ext_grm, spn_ext_dem, ord_ext_mug, sci_ext_frc, fic_ext_smn,
         sci_ext_cnc, spn_ext_god, ord_ext_tbl, spn_ext_abs, fic_ext_kwk,
         sci_ext_flu, spn_ext_wen, sci_ext_par, fic_ext_spd, spn_ext_okw, fic_ext_ram, 
         spn_ext_ysh, fic_ext_njt, spn_ext_cha, nas_ext_ron, ord_ext_taz, spn_ext_oni, nas_ext_dlp
         ) %>%
  mutate(across(c(-ont_ctry_name, -ont_subj), as.numeric)) %>%
  pivot_longer(c(-ont_ctry_name, -ont_subj), names_to = "question", values_to = "response") %>%
  mutate(
    response = ifelse(response == 99, 0.5, response),
    question_type = recode(question,
                           sci_ext_grm = "Scientific",
                           sci_ext_frc = "Scientific",
                           sci_ext_cnc = "Scientific",
                           sci_ext_flu = "Scientific",
                           sci_ext_par = "Scientific",
                           ord_ext_mug = "Ordinary",
                           ord_ext_tbl = "Ordinary",
                           ord_ext_taz = "Ordinary",
                           spn_ext_god = "Supernatural",
                           spn_ext_dem = "Supernatural",
                           spn_ext_wen = "Supernatural",
                           spn_ext_okw = "Supernatural",
                           spn_ext_abs = "Supernatural",
                           spn_ext_ysh = "Supernatural",
                           spn_ext_cha = "Supernatural",
                           nas_ext_ron = "Supernatural",
                           spn_ext_oni = "Supernatural", 
                           nas_ext_dlp = "Supernatural",
                           fic_ext_kwk = "Fictional",
                           fic_ext_smn = "Fictional",
                           fic_ext_spd = "Fictional",
                           fic_ext_ram = "Fictional", 
                           fic_ext_njt = "Fictional"), 
    
  ) %>%
  filter(!is.na(response)) %>% 
  group_by(ont_ctry_name, question) %>%
  mutate(consensus_excl_self = (sum(response, na.rm = TRUE) - response)/(n()-1),
         consensus = (sum(response, na.rm = TRUE)/n())) %>% 
  ungroup() %>% 
  mutate(item_code = str_extract(question, "[^_]+$")) #extracting final 3 characters

# making long usens df 
df_usens_long <- df_usens %>% 
  select(-ont_version) %>% 
  pivot_longer(c(-ont_ctry_name, -ont_subj), names_to = "usens_question", values_to = "usens_response") %>%
  filter(!is.na(usens_response)) %>% 
  mutate(item_code = str_extract(usens_question, "[^_]+$")) #extracting final 3 characters

# making long confidence df
df_conf_long <- df %>% 
  filter(ont_ctry_name %in% c("US", "Ghana", "Ecuador", "Peru")) %>%  
    select(ont_ctry_name, ont_subj,
           sci_conf.ext_grm, spn_conf.ext_dem, ord_conf.ext_mug, sci_conf.ext_gvt, fic_conf.ext_smn,
           sci_conf.ext_cnc, spn_conf.ext_god, ord_conf.ext_tbl, spn_conf.ext_ghs, fic_conf.ext_hap,  
           sci_conf.ext_grm, spn_conf.ext_dem, ord_conf.ext_mug, sci_conf.ext_frc, fic_conf.ext_smn,  
           sci_conf.ext_cnc, spn_conf.ext_god, ord_conf.ext_tbl, spn_conf.ext_abs, fic_conf.ext_kwk,  
           sci_conf.ext_flu, spn_conf.ext_wen, ord_conf.ext_mug, sci_conf.ext_par, fic_conf.ext_spd,  
           sci_conf.ext_cnc, spn_conf.ext_god, ord_conf.ext_tbl, spn_conf.ext_okw, fic_conf.ext_ram,  
           spn_conf.ext_ysh, sci_conf.ext_par, spn_conf.ext_god, ord_conf.ext_tbl,  
           fic_conf.ext_njt, spn_conf.ext_cha, sci_conf.ext_cnc,  
           sci_conf.ext_grm, nas_conf.ext_ron, ord_conf.ext_taz, spn_conf.ext_oni,  
           fic_conf.ext_smn, nas_conf.ext_dlp) %>%  
    mutate(across(-ont_ctry_name, as.numeric)) %>%
    pivot_longer(c(-ont_ctry_name, -ont_subj), names_to = "conf_question", values_to = "conf_response") %>%  
    filter(!is.na(conf_response)) %>%  
    mutate(category = recode(conf_question, 
                             sci_conf.ext_grm = "Scientific", 
                             sci_conf.ext_frc = "Scientific",  
                             sci_conf.ext_cnc = "Scientific",  
                             sci_conf.ext_flu = "Scientific",  
                             sci_conf.ext_par = "Scientific", 
                             sci_conf.ext_gvt = "Scientific",
                             ord_conf.ext_mug = "Ordinary",  
                             ord_conf.ext_tbl = "Ordinary",  
                             ord_conf.ext_taz = "Ordinary",  
                             spn_conf.ext_god = "Supernatural",  
                             spn_conf.ext_dem = "Supernatural", 
                             spn_conf.ext_wen = "Supernatural",  
                             spn_conf.ext_okw = "Supernatural",  
                             spn_conf.ext_abs = "Supernatural",  
                             spn_conf.ext_ysh = "Supernatural",  
                             spn_conf.ext_cha = "Supernatural",  
                             nas_conf.ext_ron = "Supernatural",  
                             spn_conf.ext_oni = "Supernatural",  
                             nas_conf.ext_dlp = "Supernatural", 
                             spn_conf.ext_ghs = "Supernatural", 
                             fic_conf.ext_kwk = "Fictional",  
                             fic_conf.ext_smn = "Fictional",  
                             fic_conf.ext_spd = "Fictional",  
                             fic_conf.ext_ram = "Fictional",  
                             fic_conf.ext_njt = "Fictional",
                             fic_conf.ext_hap = "Fictional"),
           ont_ctry_name = factor(ont_ctry_name, levels = levels_country),
           response_txt = recode(conf_response,  
                                 `0` = "Not sure",  
                                 `1` = "Somewhat sure",  
                                 `2` = "Pretty sure",  
                                 `3` = "Very sure")) %>% 
  mutate(item_code = str_extract(conf_question, "[^_]+$")) #extracting final 3 characters
# joining into one dataframe
df_ext_usens_conf <- left_join(
  df_ext_long, df_usens_long, by = c("ont_ctry_name", "ont_subj", "item_code")
) %>% 
  left_join(df_conf_long, by = c("ont_ctry_name", "ont_subj", "item_code")) %>%
  mutate(item_code = as.factor(item_code), 
         question_type = factor(question_type, levels = levels_type), 
         ont_ctry_name = factor(ont_ctry_name, levels = levels_country)) #making this a factor so we can do ordinal regression

Participant Demographics

# How many participants per country? 
xtabs(~ ont_ctry_name, data = df)
ont_ctry_name
Ecuador   Ghana    Peru      US 
     20      70      40      49 
# Version of questions (version 1 or version 2) by country 
xtabs(~ ont_ctry_name + ont_version, data = df)
             ont_version
ont_ctry_name  1  2
      Ecuador 10 10
      Ghana   35 35
      Peru    21 19
      US      21 28
#age
df %>% 
  mutate(ont_age = as.numeric(ont_age)) %>%
  group_by(ont_ctry_name) %>% 
  summarize(n = n(),
            mean_age = mean(ont_age, na.rm = T),
            med_age = median(ont_age, na.rm = T), 
            sd_age = sd(ont_age, na.rm = T), 
            range_age = paste0(min(ont_age, na.rm = T), " - ", max(ont_age, na.rm = T))) 

#sex male = 1
xtabs(~ ont_ctry_name + ont_sex, data = df)
             ont_sex
ont_ctry_name  .  1  2
      Ecuador  0  9 11
      Ghana    0 32 38
      Peru     0 25 15
      US       1 26 22
#ethnicity 
xtabs(~ tolower(ont_ethn) + ont_ctry_name, data = df)
                                                      ont_ctry_name
tolower(ont_ethn)                                      Ecuador Ghana Peru US
  .                                                          0     1    0  2
  a little bit of everything / caucasian/ puerto rican       0     0    0  1
  ahanta                                                     0     1    0  0
  akan- fante                                                0     1    0  0
  american - hispanic / anglo                                0     0    0  1
  asante/akan                                                0     1    0  0
  asian                                                      0     0    0  1
  asian + caucasian                                          0     0    0  1
  black                                                      0     0    0  2
  black + puerto rican                                       0     0    0  1
  caucasian                                                  0     0    0 22
  denkyiranyi (asante)                                       0     1    0  0
  earth inn                                                  0     0    0  1
  east indian                                                0     0    0  1
  ekuapim                                                    0     1    0  0
  fante                                                      0    49    0  0
  fante (akromah)                                            0     1    0  0
  fante (amosima)                                            0     1    0  0
  fante (brenu)                                              0     1    0  0
  fante (new ebu)                                            0     2    0  0
  fante (otum in central region)                             0     1    0  0
  fantenyi                                                   0     2    0  0
  fanti                                                      0     1    0  0
  fanti (cape-coast)                                         0     1    0  0
  fanti (egyankwa)                                           0     1    0  0
  fanti (yamoransa)                                          0     1    0  0
  fanti(ahanta)                                              0     1    0  0
  hispanic                                                   0     0    0  1
  hispanic / caucasian                                       0     0    0  1
  hispanic / native american                                 0     0    0  1
  i am a fante.                                              0     1    0  0
  irish                                                      0     0    0  1
  irish/scottish/caucasian                                   0     0    0  1
  italian                                                    0     0    0  1
  italian/american                                           0     0    0  1
  kichua                                                     1     0    0  0
  mexican american                                           0     0    0  1
  mexican/italian                                            0     0    0  1
  mut                                                        0     0    0  1
  n. european                                                0     0    0  1
  northner                                                   0     1    0  0
  persian                                                    0     0    0  1
  portuguese                                                 0     0    0  1
  salvadorian                                                0     0    0  1
  scandanavian                                               0     0    0  1
  scottish / english                                         0     0    0  1
  shipibo                                                    0     0   40  0
  waorani                                                   13     0    0  0
  waorani and kichua                                         6     0    0  0
#education 
xtabs(~ tolower(ont_hied) + ont_ctry_name, data = df)
                                             ont_ctry_name
tolower(ont_hied)                             Ecuador Ghana Peru US
  .                                                 1     1    0  1
  0                                                 0     1    0  0
  10th grade                                        2     0    0  0
  11th grade                                        5     0    0  0
  12th grade                                        9     0    0  0
  1st yr college                                    0     0    0  1
  3 yrs college                                     0     0    0  1
  8th grade                                         1     0    0  0
  9th grade                                         1     0    0  0
  abakrampa senior high school                      0     1    0  0
  abakrampa senior technical                        0     1    0  0
  abk senior high                                   0     1    0  0
  associate                                         0     0    0  1
  associate's                                       0     0    0  2
  ba                                                1     0    0  3
  ba + teaching                                     0     0    0  1
  bacelors                                          0     0    0  1
  bachelor of science                               0     0    0  1
  bachelor's                                        0     0    0  2
  bachelors                                         0     0    0  3
  brenu methodist school                            0     1    0  0
  bs                                                0     0    0  3
  college                                           0     0    0  3
  college grad                                      0     0    0  1
  did not complete junior high school               0     1    0  0
  doctorate                                         0     0    0  1
  elementary                                        0     1    0  0
  form 4                                            0     3    0  0
  form 4 (junior secondary school)                  0     1    0  0
  ged                                               0     0    0  2
  grad levels                                       0     0    0  1
  grad school                                       0     0    0  1
  graduate                                          0     0    0  1
  graduated college                                 0     0    0  1
  have not yet completed junior high school         0     1    0  0
  high school                                       0     0    0  1
  high school / some college                        0     0    0  1
  high school some trade school                     0     0    0  1
  hs                                                0     0    0  2
  hs graduate                                       0     0    0  1
  i have finished tertiary                          0     1    0  0
  j.h.s (junior high school)                        0     1    0  0
  jackson college of education                      0     1    0  0
  jhs                                               0     1    0  0
  junior college                                    0     0    0  1
  junior high                                       0     0    0  1
  junior high school                                0    11    0  0
  junior high school graduate                       0     2    0  0
  masters                                           0     0    0  2
  mba                                               0     0    0  1
  methodist jhs                                     0     4    0  0
  methodist senior high (new ebu)                   0     1    0  0
  methodists junior and senior high (new ebu)       0     1    0  0
  methodists junior secondary school, class 6       0     1    0  0
  methodists primary                                0     1    0  0
  middle school                                     0     1    0  0
  new ebu da jhs                                    0     1    0  0
  new ebu methodist middle school (1971)            0     1    0  0
  nursing training                                  0     1    0  0
  post-grad                                         0     0    0  1
  primary                                           0     1    0  0
  roman catholic girls                              0     1    0  0
  s.h.s                                             0     1    0  0
  secondary school                                  0     1    0  0
  self- hs                                          0     0    0  1
  seminary school                                   0     1    0  0
  senior high schol                                 0     1    0  0
  senior high school                                0     5    0  0
  senior high school graduate                       0     3    0  0
  shs                                               0     3    0  0
  shs- technical school                             0     1    0  0
  sm college                                        0     0    0  1
  some college                                      0     0    0  4
  stan 7                                            0     1    0  0
  takoradi senior secondary school                  0     1    0  0
  uneducated                                        0     5    0  0
  uneducated, did not attend school                 0     1    0  0
  university of cape coast                          0     2    0  0
#"importance of god "God plays a very important role in my life (strongly disagree to strongly agree)
xtabs(~ ont_ctry_name + as.numeric(ont_imgd), data = df)
             as.numeric(ont_imgd)
ont_ctry_name -2 -1  0  1  2
      Ecuador  6  1 10  2  0
      Ghana    0  1  0 13 56
      Peru     0  0  3  2 34
      US      15  9  5  5 13
#church attendance
xtabs(~ tolower(ont_chfq) + ont_ctry_name, data = df)
                                                                   ont_ctry_name
tolower(ont_chfq)                                                   Ecuador Ghana Peru US
  .                                                                       0     1    1  2
  0                                                                      15     0    1  5
  1x/week                                                                 0     0    0  2
  2 times a week.                                                         0     0    1  0
  2 times in a week                                                       0     1    0  0
  2x/week                                                                 0     0    0  1
  3 times a month                                                         0     0    1  0
  3 times a week                                                          0     3    2  0
  3 times in a week                                                       0     1    0  0
  3 to 4 times a year                                                     0     0    1  0
  4 times a month                                                         0     1    1  0
  4 times a week                                                          0     2   15  0
  4 times in a week                                                       0     1    0  0
  4,6, 8 times a month                                                    0     0    1  0
  5 times a week                                                          0     2    1  0
  5, 6 to 7 times a year                                                  0     0    1  0
  7 times a week                                                          0     1    0  0
  8 times a month                                                         0     0    1  0
  a few times in a year                                                   0     1    0  0
  a lot of times                                                          0     1    0  0
  abundant life                                                           0     0    0  1
  cathedral of faith, jubilee church on the hill, catholic churches       0     0    0  1
  catholic                                                                0     0    0  1
  every day                                                               0     1    0  0
  every saturday                                                          0     1    0  0
  every sunday                                                            0     8    0  2
  every sunday, once a week                                               0     1    0  0
  every week                                                              0     2    0  0
  everyday                                                                0     3    0  0
  everyday in new eden                                                    0     0    1  0
  fante comment                                                           0     3    0  0
  from time to time                                                       0     0    2  0
  i don't usually go                                                      0     2    0  0
  i don't usually go.                                                     0     1    0  0
  i go to jesus divine temple. people popularly call it mountain.         0     1    0  0
  infrequent                                                              3     0    0  0
  infrequent but used to preach a few years ago                           1     0    0  0
  it's been long                                                          0     1    0  0
  like five times in a year                                               0     1    0  0
  lutheran prince of peace                                                0     0    0  1
  many times                                                              0     1    0  0
  many times.                                                             0     1    0  0
  many times. every week unless i can't and then i rest.                  0     1    0  0
  mdata                                                                   0     0    0  1
  n/a                                                                     0     0    0 12
  na                                                                      0     0    0 15
  not always but i go 3 times a week                                      0     0    1  0
  not anymore                                                             0     0    0  1
  not often                                                               0     0    0  1
  now i don't go to church.                                               0     1    0  0
  often                                                                   0     3    0  0
  once a month                                                            0     0    1  0
  once a month or two months                                              0     1    0  0
  once a week                                                             0     0    3  0
  once a year                                                             0     0    2  0
  once every 2 years                                                      0     1    0  0
  once every week                                                         0     1    0  0
  once every weekend                                                      1     0    0  0
  once in a week                                                          0     1    0  0
  once in every 2 months                                                  0     1    0  0
  once in every 2 years                                                   0     1    0  0
  sunday weekly                                                           0     1    0  0
  three times                                                             0     1    0  0
  three times in a week.                                                  0     1    0  0
  thrice in a week                                                        0     1    0  0
  twice a week                                                            0     1    2  0
  twice in every week                                                     0     1    0  0
  twice in every week.                                                    0     1    0  0
  two times a week                                                        0     1    0  0
  very often                                                              0     3    0  0
  very often. every sunday                                                0     1    0  0
  virtually every sunday                                                  0     1    0  0
  weekly                                                                  0     2    0  2
  weekly catholic                                                         0     0    0  1
  when i am in school, i go to church every day                           0     1    0  0
  yes, once a month                                                       0     0    1  0
  you don't go at all.                                                    0     1    0  0
# Do you think you are richer or poorer than most of the people in your community? (much poorer - much richer)
xtabs(~ ont_ctry_name + as.numeric(ont_ses), data = df)
             as.numeric(ont_ses)
ont_ctry_name -2 -1  0  1  2
      Ecuador  0 10  9  1  0
      Ghana    4 17 15 31  3
      Peru    13  6 18  1  0
      US       2 13 23  8  1
# Do you feel you can afford to buy things you need, like clothing and shoes? (no/yes)
xtabs(~ ont_ctry_name + as.numeric(ont_affr), data = df)
             as.numeric(ont_affr)
ont_ctry_name  0  1
      Ecuador 20  0
      Ghana   23 47
      Peru    30  9
      US       5 43

Figure 1, Accompanying Analyses & Appendix C regression results

The goal here is to combine confidence and existence scores. The confidence graph above shows people’s confidence ratings regardless of whether they said the object existed or not. So, I will combine them this way: - if they said it doesn’t exist -1 - if they said it does exist 1 - if they said they don’t know *0

This way, a person who said they don’t know if it exists and a person who said it did or didn’t but said they were “not sure” will both get a score of 0. A person who is “very sure” it doesn’t exist will get a score of -3 and a person who is “very sure” it does exist will get a score of 3.

# making new column of existence response directions
df_ext_usens_conf <- df_ext_usens_conf %>% 
  mutate(ext_dir = case_when(
    response == 1 ~ 1,
    response == 0 ~ -1,
    response == 0.5 ~ 0,
    TRUE ~ response), 
    conf_dir = conf_response*ext_dir, 
    conf_dir_text = case_when(
      conf_dir == -3 ~ "Very sure doesn't exist",
      conf_dir == -2 ~ "Pretty sure doesn't exist",
      conf_dir == -1 ~ "Somewhat sure doesn't exist",
      conf_dir == 0 ~ "Not sure",
      conf_dir == 1 ~ "Somewhat sure exists",
      conf_dir == 2 ~ "Pretty sure exists",
      conf_dir == 3 ~ "Very sure exists"), 
    conf_dir_text = factor(conf_dir_text, 
                           levels = c("Very sure doesn't exist", "Pretty sure doesn't exist", "Somewhat sure doesn't exist", "Not sure", "Somewhat sure exists", "Pretty sure exists", "Very sure exists"))
    )

Graphing Figure 1

conf_colors <- (RColorBrewer::brewer.pal(7, "RdYlBu"))

# Create stacked bar plot  
df_ext_usens_conf %>% 
  filter(!is.na(conf_dir_text)) %>% 
  mutate(category = factor(category, levels = c("Ordinary", "Scientific", "Supernatural", "Fictional"))) %>%
  ggplot(aes(x = category, fill = conf_dir_text)) +  
  geom_bar(position = "fill") +  # Stacked proportions
  # geom_text(stat = "count", aes(label = after_stat(count)),
  #           position = position_fill(vjust = 0.5),
  #           size = 6, color = "white") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + 
  scale_fill_manual(values = conf_colors, drop = FALSE) + 
  theme_bw() +  
  labs(
    x = "Category of Items",  
    y = "Proportion of Responses",  
    fill = "Confidence x Existence",  
    title = "Confidence x Existence by Category and Field Site"
  ) +
  theme(axis.text.x = element_text(size = 15, angle = -35, vjust = 1, hjust = 0),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 16),
        plot.title = element_text(size = 25), 
        strip.text.x = element_text(size = 18), 
        legend.text = element_text(size = 16), 
        legend.title = element_text(size =18)) +
  facet_wrap(~ ont_ctry_name, ncol = 4)   # Separate plots for each country

Models predicting confidence x existence scores by category with separate regressions for each country. The pairwise contrasts here showing ordinary vs. supernatural and scientific vs. supernatural are what make up Table 2. Full results are reported in Appendix C.

# 1 regression per country (4 total) where response is predicted by category

# US
m.us <- lmer(conf_dir ~ question_type + (1|ont_subj), data = filter(df_ext_usens_conf, ont_ctry_name == "US"))
summary(m.us)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: filter(df_ext_usens_conf, ont_ctry_name == "US")

REML criterion at convergence: 623.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.90811 -0.26981  0.03141  0.27885  2.87739 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.2108   0.4591  
 Residual             2.4359   1.5607  
Number of obs: 164, groups:  ont_subj, 49

Fixed effects:
                          Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)                 2.9592     0.2324 157.8701  12.733  < 2e-16 ***
question_typeScientific    -0.1837     0.3153 117.5352  -0.583    0.561    
question_typeSupernatural  -2.2480     0.3228 120.0307  -6.965 1.89e-10 ***
question_typeFictional     -4.5905     0.4127 137.1724 -11.124  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.678                      
qstn_typSpr -0.663  0.488               
qstn_typFct -0.518  0.382      0.376    
##pairwise contrasts
emm.us <- emmeans(m.us, ~ question_type)
contrast(emm.us, method = "pairwise", adjust = "none")
 contrast                  estimate    SE  df t.ratio p.value
 Ordinary - Scientific        0.184 0.315 113   0.583  0.5614
 Ordinary - Supernatural      2.248 0.323 116   6.962  <.0001
 Ordinary - Fictional         4.590 0.415 134  11.069  <.0001
 Scientific - Supernatural    2.064 0.323 116   6.393  <.0001
 Scientific - Fictional       4.407 0.415 134  10.626  <.0001
 Supernatural - Fictional     2.343 0.420 132   5.584  <.0001

Degrees-of-freedom method: kenward-roger 
# Ghana
m.ghana <- lmer(conf_dir ~ question_type + (1|ont_subj), data = filter(df_ext_usens_conf, ont_ctry_name == "Ghana"))
summary(m.ghana)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: filter(df_ext_usens_conf, ont_ctry_name == "Ghana")

REML criterion at convergence: 987.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.3477 -0.4544  0.2218  0.5644  1.8879 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.1388   0.3726  
 Residual             0.8719   0.9338  
Number of obs: 348, groups:  ont_subj, 70

Fixed effects:
                          Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)                 2.7571     0.1202 319.5095  22.945   <2e-16 ***
question_typeScientific    -0.3438     0.1452 279.7692  -2.368   0.0186 *  
question_typeSupernatural  -0.2845     0.1445 279.0482  -1.969   0.0500 *  
question_typeFictional     -1.4857     0.1578 274.6964  -9.413   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.714                      
qstn_typSpr -0.717  0.588               
qstn_typFct -0.657  0.544      0.546    
##pairwise contrasts
emm.ghana <- emmeans(m.ghana, ~ question_type)
contrast(emm.ghana, method = "pairwise", adjust = "none")
 contrast                  estimate    SE  df t.ratio p.value
 Ordinary - Scientific       0.3438 0.145 280   2.368  0.0186
 Ordinary - Supernatural     0.2845 0.145 279   1.968  0.0501
 Ordinary - Fictional        1.4857 0.158 275   9.413  <.0001
 Scientific - Supernatural  -0.0593 0.132 297  -0.450  0.6531
 Scientific - Fictional      1.1419 0.145 280   7.865  <.0001
 Supernatural - Fictional    1.2012 0.145 279   8.309  <.0001

Degrees-of-freedom method: kenward-roger 
# Ecuador
m.ecuador <- lmer(conf_dir ~ question_type + (1|ont_subj), data = filter(df_ext_usens_conf, ont_ctry_name == "Ecuador"))
summary(m.ecuador)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: filter(df_ext_usens_conf, ont_ctry_name == "Ecuador")

REML criterion at convergence: 283.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.7683 -0.5352  0.2693  0.6102  2.0039 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.2237   0.4730  
 Residual             0.9541   0.9768  
Number of obs: 96, groups:  ont_subj, 20

Fixed effects:
                          Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)                 2.6500     0.2427 79.9977  10.920  < 2e-16 ***
question_typeScientific    -0.5152     0.2855 74.0151  -1.804   0.0753 .  
question_typeSupernatural  -0.4465     0.2871 73.5156  -1.555   0.1242    
question_typeFictional     -1.5790     0.3134 72.8521  -5.038  3.3e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.688                      
qstn_typSpr -0.685  0.574               
qstn_typFct -0.627  0.532      0.531    
##pairwise contrasts
emm.ecuador <- emmeans(m.ecuador, ~ question_type)
contrast(emm.ecuador, method = "pairwise", adjust = "none")
 contrast                  estimate    SE   df t.ratio p.value
 Ordinary - Scientific       0.5152 0.286 74.6   1.802  0.0756
 Ordinary - Supernatural     0.4465 0.287 74.1   1.553  0.1246
 Ordinary - Fictional        1.5790 0.314 73.5   5.036  <.0001
 Scientific - Supernatural  -0.0687 0.266 78.5  -0.259  0.7965
 Scientific - Fictional      1.0639 0.291 75.5   3.650  0.0005
 Supernatural - Fictional    1.1325 0.292 74.3   3.878  0.0002

Degrees-of-freedom method: kenward-roger 
# Peru
m.peru <- lmer(conf_dir ~ question_type + (1|ont_subj), data = filter(df_ext_usens_conf, ont_ctry_name == "Peru"))
summary(m.peru)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: filter(df_ext_usens_conf, ont_ctry_name == "Peru")

REML criterion at convergence: 640.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.2673 -0.5885  0.3191  0.4445  2.6123 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.03865  0.1966  
 Residual             0.73159  0.8553  
Number of obs: 247, groups:  ont_subj, 40

Fixed effects:
                          Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)                 2.7500     0.1388 239.5727  19.818   <2e-16 ***
question_typeScientific    -0.1076     0.1748 208.1851  -0.615    0.539    
question_typeSupernatural  -0.1367     0.1563 205.0009  -0.874    0.383    
question_typeFictional     -2.0389     0.2115 213.8722  -9.639   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.754                      
qstn_typSpr -0.843  0.669               
qstn_typFct -0.623  0.497      0.553    
##pairwise contrasts
emm.peru <- emmeans(m.peru, ~ question_type)
contrast(emm.peru, method = "pairwise", adjust = "none")
 contrast                  estimate    SE  df t.ratio p.value
 Ordinary - Scientific       0.1076 0.175 208   0.615  0.5393
 Ordinary - Supernatural     0.1367 0.156 205   0.874  0.3830
 Ordinary - Fictional        2.0389 0.212 213   9.627  <.0001
 Scientific - Supernatural   0.0291 0.136 210   0.214  0.8305
 Scientific - Fictional      1.9313 0.197 213   9.821  <.0001
 Supernatural - Fictional    1.9022 0.181 217  10.516  <.0001

Degrees-of-freedom method: kenward-roger 

Model predicting confidence x existence scores by category pooling across non-US countries. These results show that when you combine all non-US country responses together, the difference between ordinary and supernatural confidence ratings are significant.

#combinging non us countries
m.non.us <- lmer(conf_dir ~ question_type + (1|ont_ctry_name/ont_subj), data = filter(df_ext_usens_conf, ont_ctry_name != "US"))
summary(m.non.us)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_ctry_name/ont_subj)
   Data: filter(df_ext_usens_conf, ont_ctry_name != "US")

REML criterion at convergence: 1924

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.3864 -0.4471  0.2510  0.5377  2.2025 

Random effects:
 Groups                 Name        Variance Std.Dev.
 ont_subj:ont_ctry_name (Intercept) 0.113627 0.33709 
 ont_ctry_name          (Intercept) 0.003539 0.05949 
 Residual                           0.844475 0.91895 
Number of obs: 691, groups:  ont_subj:ont_ctry_name, 130; ont_ctry_name, 3

Fixed effects:
                           Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)                 2.72942    0.09344   3.60849  29.210 2.03e-05 ***
question_typeScientific    -0.29739    0.10470 563.96137  -2.840  0.00467 ** 
question_typeSupernatural  -0.23851    0.09985 550.18991  -2.389  0.01724 *  
question_typeFictional     -1.63053    0.11738 560.02347 -13.891  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.664                      
qstn_typSpr -0.698  0.618               
qstn_typFct -0.591  0.529      0.551    
##pairwise contrasts
emm.non.us <- emmeans(m.non.us, ~ question_type)
contrast(emm.non.us, method = "pairwise", adjust = "none")
 contrast                  estimate     SE  df t.ratio p.value
 Ordinary - Scientific       0.2974 0.1050 569   2.840  0.0047
 Ordinary - Supernatural     0.2385 0.1010 564   2.373  0.0180
 Ordinary - Fictional        1.6305 0.1180 565  13.874  <.0001
 Scientific - Supernatural  -0.0589 0.0903 590  -0.652  0.5144
 Scientific - Fictional      1.3331 0.1080 573  12.292  <.0001
 Supernatural - Fictional    1.3920 0.1060 561  13.190  <.0001

Degrees-of-freedom method: kenward-roger 

Model predicting confidence x existence scores by category, but only for highest contrast ordinary vs. supernatural items (coffee cups & tables vs. God & demons). These results show that these highest contrasts are significantly different in the US and Ghana, but not in Ecuador and Peru (in Ecuador, our smallest sample size, there are hints that this effect might be found in future similar studies). See Appendix A for full confidence and existence ratings broken down by item, version, and country.

# US --mugs, tables, god, demons
m.mug.us <- lmer(conf_dir ~ question_type + (1|ont_subj), data = df_ext_usens_conf %>% 
               filter(ont_ctry_name == "US",
                      item_code %in% c("mug", "tbl", "dem", "god")))
summary(m.mug.us)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: df_ext_usens_conf %>% filter(ont_ctry_name == "US", item_code %in%  
    c("mug", "tbl", "dem", "god"))

REML criterion at convergence: 374.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.09043  0.01938  0.02299  0.58511  1.29077 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.008797 0.09379 
 Residual             3.134276 1.77039 
Number of obs: 94, groups:  ont_subj, 49

Fixed effects:
                          Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)                 2.9592     0.2533 91.9994   11.68  < 2e-16 ***
question_typeSupernatural  -2.2481     0.3656 48.9678   -6.15 1.38e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
qstn_typSpr -0.691
# Ghana --mugs, tables, god, demons
m.mug.ghana <- lmer(conf_dir ~ question_type + (1|ont_subj), data = df_ext_usens_conf %>% 
               filter(ont_ctry_name == "Ghana",
                      item_code %in% c("mug", "tbl", "dem", "god")))
summary(m.mug.ghana)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: df_ext_usens_conf %>% filter(ont_ctry_name == "Ghana", item_code %in%  
    c("mug", "tbl", "dem", "god"))

REML criterion at convergence: 291.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.3442 -0.1527 -0.0012  0.5653  1.7544 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.2286   0.4781  
 Residual             0.2804   0.5296  
Number of obs: 140, groups:  ont_subj, 70

Fixed effects:
                           Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)                 2.75714    0.08527 114.84211  32.333  < 2e-16 ***
question_typeSupernatural  -0.30000    0.08951  69.00000  -3.352  0.00131 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
qstn_typSpr -0.525
# Ecuador --mugs, tables, god, Wene
m.mug.ecuador <- lmer(conf_dir ~ question_type + (1|ont_subj), data = df_ext_usens_conf %>% 
               filter(ont_ctry_name == "Ecuador",
                      item_code %in% c("mug", "tbl", "wen", "god"))) #Wene instead of demon
summary(m.mug.ecuador)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: df_ext_usens_conf %>% filter(ont_ctry_name == "Ecuador", item_code %in%  
    c("mug", "tbl", "wen", "god"))

REML criterion at convergence: 106.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.0684 -0.3950  0.1042  0.7610  1.1422 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.2511   0.5011  
 Residual             0.6754   0.8218  
Number of obs: 39, groups:  ont_subj, 20

Fixed effects:
                          Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)                 2.6500     0.2152 34.6335  12.312 3.32e-14 ***
question_typeSupernatural  -0.5397     0.2642 18.9685  -2.043   0.0552 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
qstn_typSpr -0.594
# Peru --mugs, tables, god, Oni Ibo 
m.mug.peru <- lmer(conf_dir ~ question_type + (1|ont_subj), data = df_ext_usens_conf %>% 
               filter(ont_ctry_name == "Peru",
                      item_code %in% c("taz", "tbl", "oni", "god")))
summary(m.mug.peru)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: df_ext_usens_conf %>% filter(ont_ctry_name == "Peru", item_code %in%  
    c("taz", "tbl", "oni", "god"))

REML criterion at convergence: 125.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2867  0.4317  0.4317  0.4471  0.7038 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.01877  0.1370  
 Residual             0.25314  0.5031  
Number of obs: 79, groups:  ont_subj, 40

Fixed effects:
                           Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)                2.750000   0.082449 76.628610  33.354   <2e-16 ***
question_typeSupernatural -0.007738   0.113272 38.128326  -0.068    0.946    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
qstn_typSpr -0.678

Figure 2 & Accompanying Analyses

data_long_comm <- df %>%
  filter(ont_ctry_name %in% c("US", "Ghana", "Ecuador", "Peru")) %>%  
    select(ont_ctry_name, ont_subj,
           sci_comu_grm, spn_comu_dem, ord_comu_mug, sci_comu_gvt, fic_comu_smn,
           sci_comu_cnc, spn_comu_god, ord_comu_tbl, spn_comu_ghs, fic_comu_hap,  
           sci_comu_grm, spn_comu_dem, ord_comu_mug, sci_comu_frc, fic_comu_smn,  
           sci_comu_cnc, spn_comu_god, ord_comu_tbl, spn_comu_abs, fic_comu_kwk,  
           sci_comu_flu, spn_comu_wen, ord_comu_mug, sci_comu_par, fic_comu_spd,  
           sci_comu_cnc, spn_comu_god, ord_comu_tbl, spn_comu_okw, fic_comu_ram,  
           spn_comu_ysh, sci_comu_par, spn_comu_god, ord_comu_tbl,  
           fic_comu_njt, spn_comu_cha, sci_comu_cnc,  
           sci_comu_grm, nas_comu_ron, ord_comu_taz, spn_comu_oni,  
           fic_comu_smn, nas_comu_dlp) %>%  
    mutate(across(c(-ont_ctry_name, -ont_subj), as.numeric)) %>%
    pivot_longer(c(-ont_ctry_name, -ont_subj), names_to = "question", values_to = "response") %>%  
    mutate(response = ifelse(response == 99, 0.5, response)) %>%
    filter(!is.na(response)) %>%  
    mutate(category = recode(question, 
                             sci_comu_grm = "Scientific", 
                             sci_comu_frc = "Scientific",  
                             sci_comu_cnc = "Scientific",  
                             sci_comu_flu = "Scientific",  
                             sci_comu_par = "Scientific", 
                             sci_comu_gvt = "Scientific",
                             ord_comu_mug = "Ordinary",  
                             ord_comu_tbl = "Ordinary",  
                             ord_comu_taz = "Ordinary",  
                             spn_comu_god = "Supernatural",  
                             spn_comu_dem = "Supernatural", 
                             spn_comu_wen = "Supernatural",  
                             spn_comu_okw = "Supernatural",  
                             spn_comu_abs = "Supernatural",  
                             spn_comu_ysh = "Supernatural",  
                             spn_comu_cha = "Supernatural",  
                             nas_comu_ron = "Supernatural",  
                             spn_comu_oni = "Supernatural",  
                             nas_comu_dlp = "Supernatural", 
                             spn_comu_ghs = "Supernatural", 
                             fic_comu_kwk = "Fictional",  
                             fic_comu_smn = "Fictional",  
                             fic_comu_spd = "Fictional",  
                             fic_comu_ram = "Fictional",  
                             fic_comu_njt = "Fictional",
                             fic_comu_hap = "Fictional"),  
           response_txt = recode(response,
                                 `0` = "No",
                                 `1` = "Yes",
                                 `0.5` = "IDK"),
           response_txt = factor(response_txt, levels = c("No", "IDK", "Yes"))) %>%  
    filter(!is.na(category))  

  # Compute avg per category  
  cat_order <- data_long_comm %>%
    group_by(category) %>%
    summarise(m = mean(response))
     

  # Merge avg and reorder category  
  data_long_comm <- data_long_comm %>%  
    left_join(cat_order, by = "category") %>%  
    mutate(category = fct_reorder(category, m))
  
   conf_colors <- setNames(brewer.pal(3, "RdYlBu"), 
                           c("No", "IDK", "Yes"))
  
  # conf_colors <- setNames(c("#01665e","#5ab4ac","#8c510a"), 
  #                         c("Yes", "IDK", "No"))

  # Create stacked bar plot  
data_long_comm %>%
  mutate(category = factor(category, levels = c("Ordinary", "Scientific", "Supernatural", "Fictional")), 
         ont_ctry_name = factor(ont_ctry_name, levels = levels_country)) %>%
  ggplot(aes(x = category, fill = response_txt)) +  
  geom_bar(position = "fill") +  # Stacked proportions
  # geom_text(stat = "count", aes(label = after_stat(count)),   
  #           position = position_fill(vjust = 0.5),   
  #           size = 6, color = "white") +  
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + 
  scale_fill_manual(values = conf_colors, drop = FALSE) + 
  theme_bw() +  
  labs(
    x = "Category of Items",  
    y = "Proportion of Responses",  
    fill = "Responses",  
    title = "Can people communicate with __? by Category and Field Site"
  ) +
  theme(axis.text.x = element_text(size = 15, angle = -35, vjust = 1, hjust = 0),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 16),
        plot.title = element_text(size = 25), 
        strip.text.x = element_text(size = 18), 
        legend.text = element_text(size = 16), 
        legend.title = element_text(size =18)) +
  facet_wrap(~ ont_ctry_name, ncol = 4)   # Separate plots for each country



data_long_comm <- df %>%
  filter(ont_ctry_name %in% c("US", "Ghana", "Ecuador", "Peru")) %>%  
    select(ont_ctry_name, ont_subj,
           sci_comu_grm, spn_comu_dem, ord_comu_mug, sci_comu_gvt, fic_comu_smn,
           sci_comu_cnc, spn_comu_god, ord_comu_tbl, spn_comu_ghs, fic_comu_hap,  
           sci_comu_grm, spn_comu_dem, ord_comu_mug, sci_comu_frc, fic_comu_smn,  
           sci_comu_cnc, spn_comu_god, ord_comu_tbl, spn_comu_abs, fic_comu_kwk,  
           sci_comu_flu, spn_comu_wen, ord_comu_mug, sci_comu_par, fic_comu_spd,  
           sci_comu_cnc, spn_comu_god, ord_comu_tbl, spn_comu_okw, fic_comu_ram,  
           spn_comu_ysh, sci_comu_par, spn_comu_god, ord_comu_tbl,  
           fic_comu_njt, spn_comu_cha, sci_comu_cnc,  
           sci_comu_grm, nas_comu_ron, ord_comu_taz, spn_comu_oni,  
           fic_comu_smn, nas_comu_dlp) %>%  
    mutate(across(c(-ont_ctry_name, -ont_subj), as.numeric)) %>%
    pivot_longer(c(-ont_ctry_name, -ont_subj), names_to = "question", values_to = "response") %>%  
    mutate(response = ifelse(response == 99, 0.5, response)) %>%
    filter(!is.na(response)) %>%  
    mutate(category = recode(question, 
                             sci_comu_grm = "Scientific", 
                             sci_comu_frc = "Scientific",  
                             sci_comu_cnc = "Scientific",  
                             sci_comu_flu = "Scientific",  
                             sci_comu_par = "Scientific", 
                             sci_comu_gvt = "Scientific",
                             ord_comu_mug = "Ordinary",  
                             ord_comu_tbl = "Ordinary",  
                             ord_comu_taz = "Ordinary",  
                             spn_comu_god = "Supernatural",  
                             spn_comu_dem = "Supernatural", 
                             spn_comu_wen = "Supernatural",  
                             spn_comu_okw = "Supernatural",  
                             spn_comu_abs = "Supernatural",  
                             spn_comu_ysh = "Supernatural",  
                             spn_comu_cha = "Supernatural",  
                             nas_comu_ron = "Supernatural",  
                             spn_comu_oni = "Supernatural",  
                             nas_comu_dlp = "Supernatural", 
                             spn_comu_ghs = "Supernatural", 
                             fic_comu_kwk = "Fictional",  
                             fic_comu_smn = "Fictional",  
                             fic_comu_spd = "Fictional",  
                             fic_comu_ram = "Fictional",  
                             fic_comu_njt = "Fictional",
                             fic_comu_hap = "Fictional"),  
           response_txt = recode(response,
                                 `0` = "No",
                                 `1` = "Yes",
                                 `0.5` = "IDK"),
           response_txt = factor(response_txt, levels = c("No", "IDK", "Yes"))) %>%  
    filter(!is.na(category))  

Models predicting “Can people communicate with X?” responses by category. The pairwise contrasts from these models are reported in the manuscript under the section “Additional Questions Reflect Differences in Epistemic Frames”

# I want 1 regression per country (4 total) where response is predicted by category

# US
m.comm.us <- lmer(response ~ category + (1|ont_subj), data = filter(data_long_comm, ont_ctry_name == "US"))
summary(m.comm.us)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: response ~ category + (1 | ont_subj)
   Data: filter(data_long_comm, ont_ctry_name == "US")

REML criterion at convergence: 262

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.9138 -0.6348 -0.1107  0.6635  2.5365 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.08442  0.2905  
 Residual             0.12076  0.3475  
Number of obs: 244, groups:  ont_subj, 49

Fixed effects:
                      Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)            0.36735    0.06471 142.69707   5.677  7.4e-08 ***
categoryScientific    -0.03998    0.06510 193.23170  -0.614    0.540    
categoryFictional     -0.10204    0.07021 191.90328  -1.453    0.148    
categorySupernatural   0.28896    0.06399 193.08577   4.515  1.1e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) ctgrySc ctgryF
ctgryScntfc -0.585               
catgryFctnl -0.542  0.539        
ctgrySprntr -0.595  0.581   0.549
##pairwise contrasts
emm.comm.us <- emmeans(m.comm.us, ~ category)
contrast(emm.comm.us, method = "pairwise", adjust = "none")
 contrast                  estimate     SE  df t.ratio p.value
 Ordinary - Scientific       0.0400 0.0651 193   0.614  0.5399
 Ordinary - Fictional        0.1020 0.0702 192   1.453  0.1477
 Ordinary - Supernatural    -0.2890 0.0640 193  -4.515  <.0001
 Scientific - Fictional      0.0621 0.0651 193   0.953  0.3417
 Scientific - Supernatural  -0.3289 0.0591 198  -5.564  <.0001
 Fictional - Supernatural   -0.3910 0.0640 193  -6.109  <.0001

Degrees-of-freedom method: kenward-roger 
# Ghana
m.comm.ghana <- lmer(response ~ category + (1|ont_subj), data = filter(data_long_comm, ont_ctry_name == "Ghana"))
summary(m.comm.ghana)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: response ~ category + (1 | ont_subj)
   Data: filter(data_long_comm, ont_ctry_name == "Ghana")

REML criterion at convergence: 131.2

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.94583 -0.33207 -0.08662  0.63525  2.97487 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.006527 0.08079 
 Residual             0.075654 0.27505 
Number of obs: 350, groups:  ont_subj, 70

Fixed effects:
                      Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)            0.02143    0.03426 337.26679   0.625    0.532    
categoryScientific     0.03737    0.04253 282.33502   0.879    0.380    
categoryFictional      0.24286    0.04649 277.00891   5.224 3.45e-07 ***
categorySupernatural   0.78644    0.04253 282.33502  18.492  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) ctgrySc ctgryF
ctgryScntfc -0.742               
catgryFctnl -0.678  0.547        
ctgrySprntr -0.742  0.593   0.547
##pairwise contrasts
emm.comm.ghana <- emmeans(m.comm.ghana, ~ category)
contrast(emm.comm.ghana, method = "pairwise", adjust = "none")
 contrast                  estimate     SE  df t.ratio p.value
 Ordinary - Scientific      -0.0374 0.0425 282  -0.879  0.3804
 Ordinary - Fictional       -0.2429 0.0465 277  -5.224  <.0001
 Ordinary - Supernatural    -0.7864 0.0425 282 -18.486  <.0001
 Scientific - Fictional     -0.2055 0.0425 282  -4.830  <.0001
 Scientific - Supernatural  -0.7491 0.0384 302 -19.501  <.0001
 Fictional - Supernatural   -0.5436 0.0425 282 -12.777  <.0001

Degrees-of-freedom method: kenward-roger 
# Ecuador
m.comm.ecuador <- lmer(response ~ category + (1|ont_subj), data = filter(data_long_comm, ont_ctry_name == "Ecuador"))
summary(m.comm.ecuador)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: response ~ category + (1 | ont_subj)
   Data: filter(data_long_comm, ont_ctry_name == "Ecuador")

REML criterion at convergence: 61.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6608 -0.2785 -0.1655  0.5305  2.9256 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.001555 0.03944 
 Residual             0.102169 0.31964 
Number of obs: 90, groups:  ont_subj, 20

Fixed effects:
                     Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)           0.05000    0.07202 85.91024   0.694    0.489    
categoryScientific    0.03612    0.09295 71.44265   0.389    0.699    
categoryFictional     0.78346    0.10389 71.05523   7.541 1.18e-10 ***
categorySupernatural  0.68932    0.09782 73.01647   7.047 8.52e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) ctgrySc ctgryF
ctgryScntfc -0.763               
catgryFctnl -0.683  0.529        
ctgrySprntr -0.725  0.562   0.503
##pairwise contrasts
emm.comm.ecuador <- emmeans(m.comm.ecuador, ~ category)
contrast(emm.comm.ecuador, method = "pairwise", adjust = "none")
 contrast                  estimate     SE   df t.ratio p.value
 Ordinary - Scientific      -0.0361 0.0931 69.4  -0.388  0.6993
 Ordinary - Fictional       -0.7835 0.1040 68.9  -7.533  <.0001
 Ordinary - Supernatural    -0.6893 0.0981 71.1  -7.024  <.0001
 Scientific - Fictional     -0.7473 0.0963 71.1  -7.759  <.0001
 Scientific - Supernatural  -0.6532 0.0901 75.0  -7.248  <.0001
 Fictional - Supernatural    0.0941 0.1010 72.1   0.931  0.3548

Degrees-of-freedom method: kenward-roger 
# Peru
m.comm.peru <- lmer(response ~ category + (1|ont_subj), data = filter(data_long_comm, ont_ctry_name == "Peru"))
summary(m.comm.peru)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: response ~ category + (1 | ont_subj)
   Data: filter(data_long_comm, ont_ctry_name == "Peru")

REML criterion at convergence: 245.5

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.45840 -1.11107 -0.01983  1.14905  2.42631 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.003096 0.05564 
 Residual             0.147084 0.38352 
Number of obs: 248, groups:  ont_subj, 40

Fixed effects:
                       Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)          -3.001e-16  6.127e-02  2.433e+02   0.000    1.000    
categoryScientific    1.601e-02  7.833e-02  2.090e+02   0.204    0.838    
categoryFictional     4.277e-01  9.368e-02  2.145e+02   4.565 8.39e-06 ***
categorySupernatural  5.419e-01  7.010e-02  2.053e+02   7.731 4.68e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) ctgrySc ctgryF
ctgryScntfc -0.766               
catgryFctnl -0.641  0.502        
ctgrySprntr -0.856  0.670   0.560
##pairwise contrasts
emm.comm.peru <- emmeans(m.comm.peru, ~ category)
contrast(emm.comm.peru, method = "pairwise", adjust = "none")
 contrast                  estimate     SE  df t.ratio p.value
 Ordinary - Scientific       -0.016 0.0784 209  -0.204  0.8384
 Ordinary - Fictional        -0.428 0.0938 215  -4.560  <.0001
 Ordinary - Supernatural     -0.542 0.0701 206  -7.731  <.0001
 Scientific - Fictional      -0.412 0.0870 215  -4.733  <.0001
 Scientific - Supernatural   -0.526 0.0608 212  -8.644  <.0001
 Fictional - Supernatural    -0.114 0.0797 218  -1.433  0.1533

Degrees-of-freedom method: kenward-roger 

Figure 3 & Accompanying Analyses

data_long_spec <- df %>%
  filter(ont_ctry_name %in% c("US", "Ecuador", "Peru")) %>%  #question wasn't asked in ghana
    select(ont_ctry_name, ont_subj,
           sci_spexp_grm, spn_spexp_dem, ord_spexp_mug, sci_spexp_gvt, fic_spexp_smn,
           sci_spexp_cnc, spn_spexp_god, ord_spexp_tbl, spn_spexp_ghs, fic_spexp_hap,  
           # sci_spexp_grm, spn_spexp_dem, ord_spexp_mug, sci_spexp_frc, fic_spexp_smn,  
           # sci_spexp_cnc, spn_spexp_god, ord_spexp_tbl, spn_spexp_abs, fic_spexp_kwk,  
           sci_spexp_flu, spn_spexp_wen, ord_spexp_mug, sci_spexp_par, fic_spexp_spd,  
           sci_spexp_cnc, spn_spexp_god, ord_spexp_tbl, spn_spexp_okw, fic_spexp_ram,  
           spn_spexp_ysh, sci_spexp_par, spn_spexp_god, ord_spexp_tbl,  
           fic_spexp_njt, spn_spexp_cha, sci_spexp_cnc,  
           sci_spexp_grm, nas_spexp_ron, ord_spexp_taz, spn_spexp_oni,  
           fic_spexp_smn, nas_spexp_dlp) %>%  
    mutate(across(c(-ont_ctry_name, -ont_subj), as.numeric)) %>%
    pivot_longer(c(-ont_ctry_name, -ont_subj), names_to = "question", values_to = "response") %>%  
    mutate(response = ifelse(response == 99, 0.5, response)) %>%
    filter(!is.na(response)) %>%  
    mutate(category = recode(question, 
                             sci_spexp_grm = "Scientific", 
                             sci_spexp_frc = "Scientific",  
                             sci_spexp_cnc = "Scientific",  
                             sci_spexp_flu = "Scientific",  
                             sci_spexp_par = "Scientific", 
                             sci_spexp_gvt = "Scientific",
                             ord_spexp_mug = "Ordinary",  
                             ord_spexp_tbl = "Ordinary",  
                             ord_spexp_taz = "Ordinary",  
                             spn_spexp_god = "Supernatural",  
                             spn_spexp_dem = "Supernatural", 
                             spn_spexp_wen = "Supernatural",  
                             spn_spexp_okw = "Supernatural",  
                             spn_spexp_abs = "Supernatural",  
                             spn_spexp_ysh = "Supernatural",  
                             spn_spexp_cha = "Supernatural",  
                             nas_spexp_ron = "Supernatural",  
                             spn_spexp_oni = "Supernatural",  
                             nas_spexp_dlp = "Supernatural", 
                             spn_spexp_ghs = "Supernatural", 
                             fic_spexp_kwk = "Fictional",  
                             fic_spexp_smn = "Fictional",  
                             fic_spexp_spd = "Fictional",  
                             fic_spexp_ram = "Fictional",  
                             fic_spexp_njt = "Fictional",
                             fic_spexp_hap = "Fictional"),  
           response_txt = recode(response,
                                 `0` = "Anyone",
                                 `1` = "Only specific people",
                                 `0.5` = "IDK"),
           response_txt = factor(response_txt, levels = c("Anyone", "IDK", "Only specific people"))) %>%  
    filter(!is.na(category))  

  # Compute avg per category  
  cat_order <- data_long_spec %>%
    group_by(category) %>%
    summarise(m = mean(response))
     

  # Merge avg and reorder category  
  data_long_spec <- data_long_spec %>%  
    left_join(cat_order, by = "category") %>%  
    mutate(category = fct_reorder(category, m))
  
  conf_colors <- setNames(brewer.pal(3, "RdYlBu"), 
                           c("Anyone", "IDK", "Only specific people"))
  
  # conf_colors <- setNames(brewer.pal(3, "Set2"), 
  #                         c("Anyone", "IDK", "Only specific people"))

  # Create stacked bar plot  
data_long_spec %>%
  mutate(category = factor(category, levels = c("Ordinary", "Scientific", "Supernatural", "Fictional")), 
         ont_ctry_name = factor(ont_ctry_name, levels = levels_country)) %>%
  ggplot(aes(x = category, fill = response_txt)) +  
  geom_bar(position = "fill") +  # Stacked proportions
  # geom_text(stat = "count", aes(label = after_stat(count)),   
  #           position = position_fill(vjust = 0.5),   
  #           size = 6, color = "white") +  
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + 
  scale_fill_manual(values = conf_colors, drop = FALSE) + 
  theme_bw() +  
  labs(
    x = "Category of Items",  
    y = "Proportion of Responses",  
    fill = "Responses",  
    title = "Can __ be experienced by anyone or only by specific people?\nby Category and Field Site"
  ) +
  theme(axis.text.x = element_text(size = 15, angle = -35, vjust = 1, hjust = 0),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 16),
        plot.title = element_text(size = 25), 
        strip.text.x = element_text(size = 18), 
        legend.text = element_text(size = 16), 
        legend.title = element_text(size =18)) +
  facet_wrap(~ ont_ctry_name, ncol = 4)  # Separate plots for each country

Models predicting “Can X be experienced by anyone or only by specific people?” responses by category. The pairwise contrasts from these models are reported in the manuscript under the section “Additional Questions Reflect Differences in Epistemic Frames”

# 1 regression per country (4 total) where response is predicted by category

# US
m.spec.us <- lmer(response ~ category + (1|ont_subj), data = filter(data_long_spec, ont_ctry_name == "US"))
summary(m.spec.us)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: response ~ category + (1 | ont_subj)
   Data: filter(data_long_spec, ont_ctry_name == "US")

REML criterion at convergence: 220.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-0.9216 -0.7635 -0.2711 -0.2271  2.4120 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.002358 0.04856 
 Residual             0.139782 0.37387 
Number of obs: 234, groups:  ont_subj, 49

Fixed effects:
                       Estimate Std. Error         df t value Pr(>|t|)   
(Intercept)            0.102041   0.053859 229.724066   1.895  0.05940 . 
categoryScientific    -0.002248   0.069678 189.097447  -0.032  0.97429   
categoryFictional      0.197425   0.077221 187.294488   2.557  0.01136 * 
categorySupernatural   0.197507   0.069704 192.401201   2.834  0.00509 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) ctgrySc ctgryF
ctgryScntfc -0.760               
catgryFctnl -0.686  0.530        
ctgrySprntr -0.760  0.586   0.531
##pairwise contrasts
emm.spec.us <- emmeans(m.spec.us, ~ category)
contrast(emm.spec.us, method = "pairwise", adjust = "none")
 contrast                   estimate     SE  df t.ratio p.value
 Ordinary - Scientific      2.25e-03 0.0697 188   0.032  0.9743
 Ordinary - Fictional      -1.97e-01 0.0772 186  -2.556  0.0114
 Ordinary - Supernatural   -1.98e-01 0.0698 191  -2.831  0.0051
 Scientific - Fictional    -2.00e-01 0.0716 194  -2.788  0.0058
 Scientific - Supernatural -2.00e-01 0.0636 210  -3.139  0.0019
 Fictional - Supernatural  -8.18e-05 0.0715 188  -0.001  0.9991

Degrees-of-freedom method: kenward-roger 
# Ecuador
m.spec.ecuador <- lmer(response ~ category + (1|ont_subj), data = filter(data_long_spec, ont_ctry_name == "Ecuador"))
summary(m.spec.ecuador)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: response ~ category + (1 | ont_subj)
   Data: filter(data_long_spec, ont_ctry_name == "Ecuador")

REML criterion at convergence: 66.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.17331 -0.34012 -0.19720 -0.01107  2.76448 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.003315 0.05757 
 Residual             0.103822 0.32221 
Number of obs: 93, groups:  ont_subj, 20

Fixed effects:
                      Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)          4.938e-17  7.319e-02 8.861e+01   0.000 1.000000    
categoryScientific   7.054e-02  9.447e-02 7.282e+01   0.747 0.457679    
categoryFictional    1.060e-01  1.033e-01 7.081e+01   1.027 0.308029    
categorySupernatural 3.470e-01  9.597e-02 7.287e+01   3.615 0.000549 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) ctgrySc ctgryF
ctgryScntfc -0.751               
catgryFctnl -0.687  0.532        
ctgrySprntr -0.739  0.571   0.524
##pairwise contrasts
emm.spec.ecuador <- emmeans(m.spec.ecuador, ~ category)
contrast(emm.spec.ecuador, method = "pairwise", adjust = "none")
 contrast                  estimate     SE   df t.ratio p.value
 Ordinary - Scientific      -0.0705 0.0947 72.9  -0.745  0.4587
 Ordinary - Fictional       -0.1060 0.1030 70.9  -1.026  0.3083
 Ordinary - Supernatural    -0.3470 0.0962 72.9  -3.606  0.0006
 Scientific - Fictional     -0.0355 0.0963 74.2  -0.368  0.7136
 Scientific - Supernatural  -0.2764 0.0891 80.2  -3.103  0.0026
 Fictional - Supernatural   -0.2409 0.0977 73.2  -2.467  0.0160

Degrees-of-freedom method: kenward-roger 
# Peru
m.spec.peru <- lmer(response ~ category + (1|ont_subj), data = filter(data_long_spec, ont_ctry_name == "Peru"))
summary(m.spec.peru)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: response ~ category + (1 | ont_subj)
   Data: filter(data_long_spec, ont_ctry_name == "Peru")

REML criterion at convergence: 250.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-0.79931 -0.72533 -0.66887  0.03252  2.27273 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.001803 0.04247 
 Residual             0.154486 0.39305 
Number of obs: 243, groups:  ont_subj, 40

Fixed effects:
                      Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)          8.852e-17  6.251e-02 2.388e+02   0.000 1.000000    
categoryScientific   2.796e-01  8.054e-02 2.062e+02   3.471 0.000631 ***
categoryFictional    1.064e-01  9.694e-02 2.116e+02   1.098 0.273642    
categorySupernatural 2.931e-01  7.207e-02 2.017e+02   4.066 6.85e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) ctgrySc ctgryF
ctgryScntfc -0.767               
catgryFctnl -0.637  0.495        
ctgrySprntr -0.857  0.665   0.553
##pairwise contrasts
emm.spec.peru <- emmeans(m.spec.peru, ~ category)
contrast(emm.spec.peru, method = "pairwise", adjust = "none")
 contrast                  estimate     SE  df t.ratio p.value
 Ordinary - Scientific      -0.2796 0.0806 206  -3.469  0.0006
 Ordinary - Fictional       -0.1064 0.0971 211  -1.096  0.2743
 Ordinary - Supernatural    -0.2931 0.0721 201  -4.066  0.0001
 Scientific - Fictional      0.1732 0.0904 212   1.915  0.0568
 Scientific - Supernatural  -0.0135 0.0629 208  -0.214  0.8304
 Fictional - Supernatural   -0.1867 0.0830 215  -2.248  0.0256

Degrees-of-freedom method: kenward-roger 

Figure 4

Can __ be sensed? This combines across all sensory questions for each item. The items differed from country to country and version to version. But almost all contain the questions: see, hear, smell, touch, feel. Many but not all also had a taste question.

Figure 5

Table 3 & Accompanying Analyses

Models predicting confidence x existence scores with consensus and sensory experience scores. The results are reported in Table 3 in the manuscript

# for more details on consensus score calculation, see the data frame where it is created in Data Wrangling 

m.conf <- lmer(conf_dir ~ consensus_excl_self + usens_response + (1 | ont_ctry_name/ont_subj), 
              data = df_ext_usens_conf)
summary(m.conf)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ consensus_excl_self + usens_response + (1 | ont_ctry_name/ont_subj)
   Data: df_ext_usens_conf

REML criterion at convergence: 2134.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.2610 -0.4330  0.0861  0.3859  3.9757 

Random effects:
 Groups                 Name        Variance Std.Dev.
 ont_subj:ont_ctry_name (Intercept) 0.132745 0.36434 
 ont_ctry_name          (Intercept) 0.009728 0.09863 
 Residual                           1.040922 1.02026 
Number of obs: 714, groups:  ont_subj:ont_ctry_name, 177; ont_ctry_name, 4

Fixed effects:
                     Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)          -2.92816    0.21417  76.07243 -13.672   <2e-16 ***
consensus_excl_self   5.00615    0.22733 354.91570  22.022   <2e-16 ***
usens_response        0.78817    0.09002 688.50272   8.756   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) cnsn__
cnsnss_xcl_ -0.900       
usens_rspns -0.099 -0.197
# making Table 3
m.conf %>% 
    tbl_regression(intercept = TRUE) %>% 
    as_gt() %>% 
    gt::tab_header(title = "Regression Results: Effects of Consensus and Sensory Evidence on Confidence")
Regression Results: Effects of Consensus and Sensory Evidence on Confidence
Characteristic Beta 95% CI p-value
(Intercept) -2.9 -3.4, -2.5 <0.001
consensus_excl_self 5.0 4.6, 5.5 <0.001
usens_response 0.79 0.61, 0.96 <0.001
Abbreviation: CI = Confidence Interval

ALTERNATE CODING & FIG 1 et al

df_ext_usens_conf_ALT <- df_ext_usens_conf %>% 
  mutate(ext_dir = case_when(
    response == 1 ~ 1,
    response == 0 ~ -1,
    response == 0.5 ~ 0,
    TRUE ~ response), 
    ext_label = case_when(
      ext_dir == 1 ~ "exist",
      ext_dir == -1 ~ "not", 
      ext_dir == 0 ~ "unsure"),
    conf_dir = case_when(
      ext_label == "exist" ~ ext_dir + conf_response,
      ext_label == "not" ~ ext_dir - conf_response,
      ext_label == "unsure" ~ 0),
    conf_dir_text = case_when(
      conf_dir == -4 ~ "Very sure doesn't exist",
      conf_dir == -3 ~ "Pretty sure doesn't exist",
      conf_dir == -2 ~ "Somewhat sure doesn't exist",
      conf_dir == -1 ~ "Not sure doesn't exist",
      conf_dir == 0 ~ "Not sure",
      conf_dir == 1 ~ "Not sure exists",
      conf_dir == 2 ~ "Somewhat sure exists",
      conf_dir == 3 ~ "Pretty sure exists",
      conf_dir == 4 ~ "Very sure exists"), 
    conf_dir_text = factor(conf_dir_text, 
                           levels = c("Very sure doesn't exist", "Pretty sure doesn't exist", "Somewhat sure doesn't exist", "Not sure doesn't exist", "Not sure", "Not sure exists", "Somewhat sure exists", "Pretty sure exists", "Very sure exists"))
  )
conf_colors <- (RColorBrewer::brewer.pal(9, "RdYlBu"))

# Create stacked bar plot  
df_ext_usens_conf_ALT %>% 
  filter(!is.na(conf_dir_text), !is.na(category)) %>% 
  mutate(category = factor(category, levels = c("Ordinary", "Scientific", "Supernatural", "Fictional"))) %>%
  ggplot(aes(x = category, fill = conf_dir_text)) +  
  geom_bar(position = "fill") +  # Stacked proportions
  # geom_text(stat = "count", aes(label = after_stat(count)),   
  #           position = position_fill(vjust = 0.5),   
  #           size = 6, color = "white") +  
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + 
  scale_fill_manual(values = conf_colors, drop = FALSE) + 
  theme_bw() +  
  labs(
    x = "Category of Objects",  
    y = "Proportion of Responses",  
    fill = "Confidence x Existence",  
    title = "Confidence x Existence by Category and Country"
  ) +
  theme(axis.text.x = element_text(size = 15, angle = -35, vjust = 1, hjust = 0),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 16),
        plot.title = element_text(size = 25), 
        strip.text.x = element_text(size = 18), 
        legend.text = element_text(size = 16), 
        legend.title = element_text(size =18)) +
  facet_wrap(~ ont_ctry_name, ncol = 4)   # Separate plots for each country

# 1 regression per country (4 total) where response is predicted by category

# US
m.us <- lmer(conf_dir ~ question_type + (1|ont_subj), data = filter(df_ext_usens_conf_ALT, ont_ctry_name == "US"))
summary(m.us)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: filter(df_ext_usens_conf_ALT, ont_ctry_name == "US")

REML criterion at convergence: 735.9

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-3.05877 -0.27588  0.01684  0.27397  2.88053 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.3683   0.6069  
 Residual             4.4209   2.1026  
Number of obs: 168, groups:  ont_subj, 49

Fixed effects:
                          Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)                 3.9592     0.3126 161.8633  12.664  < 2e-16 ***
question_typeScientific    -0.2245     0.4248 120.1173  -0.528    0.598    
question_typeSupernatural  -3.1020     0.4248 120.1173  -7.303 3.37e-11 ***
question_typeFictional     -6.1828     0.5557 140.3890 -11.127  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.679                      
qstn_typSpr -0.679  0.500               
qstn_typFct -0.519  0.382      0.382    
##pairwise contrasts
emm.us <- emmeans(m.us, ~ question_type)
contrast(emm.us, method = "pairwise", adjust = "none")
 contrast                  estimate    SE  df t.ratio p.value
 Ordinary - Scientific        0.224 0.425 117   0.528  0.5982
 Ordinary - Supernatural      3.102 0.425 117   7.303  <.0001
 Ordinary - Fictional         6.183 0.558 138  11.072  <.0001
 Scientific - Supernatural    2.878 0.425 117   6.774  <.0001
 Scientific - Fictional       5.958 0.558 138  10.670  <.0001
 Supernatural - Fictional     3.081 0.558 138   5.517  <.0001

Degrees-of-freedom method: kenward-roger 
# Ghana
m.ghana <- lmer(conf_dir ~ question_type + (1|ont_subj), data = filter(df_ext_usens_conf_ALT, ont_ctry_name == "Ghana"))
summary(m.ghana)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: filter(df_ext_usens_conf_ALT, ont_ctry_name == "Ghana")

REML criterion at convergence: 1160.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.5726 -0.3506  0.1818  0.4952  1.8554 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.1846   0.4296  
 Residual             1.4565   1.2068  
Number of obs: 349, groups:  ont_subj, 70

Fixed effects:
                          Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)                 3.7571     0.1531 328.0187  24.539   <2e-16 ***
question_typeScientific    -0.4260     0.1871 280.4269  -2.277   0.0235 *  
question_typeSupernatural  -0.3013     0.1867 280.3591  -1.614   0.1078    
question_typeFictional     -1.9429     0.2040 275.6218  -9.524   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.726                      
qstn_typSpr -0.728  0.590               
qstn_typFct -0.666  0.545      0.546    
##pairwise contrasts
emm.ghana <- emmeans(m.ghana, ~ question_type)
contrast(emm.ghana, method = "pairwise", adjust = "none")
 contrast                  estimate    SE  df t.ratio p.value
 Ordinary - Scientific        0.426 0.187 281   2.276  0.0236
 Ordinary - Supernatural      0.301 0.187 281   1.613  0.1079
 Ordinary - Fictional         1.943 0.204 276   9.524  <.0001
 Scientific - Supernatural   -0.125 0.169 298  -0.736  0.4621
 Scientific - Fictional       1.517 0.187 281   8.106  <.0001
 Supernatural - Fictional     1.642 0.187 281   8.789  <.0001

Degrees-of-freedom method: kenward-roger 
# Ecuador
m.ecuador <- lmer(conf_dir ~ question_type + (1|ont_subj), data = filter(df_ext_usens_conf_ALT, ont_ctry_name == "Ecuador"))
summary(m.ecuador)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: filter(df_ext_usens_conf_ALT, ont_ctry_name == "Ecuador")

REML criterion at convergence: 324.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.7139 -0.5337  0.2668  0.5260  1.7660 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.17     0.4123  
 Residual             1.60     1.2649  
Number of obs: 96, groups:  ont_subj, 20

Fixed effects:
                          Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)                 3.6500     0.2975 88.3018  12.270  < 2e-16 ***
question_typeScientific    -0.5375     0.3690 73.8784  -1.457    0.149    
question_typeSupernatural  -0.5322     0.3713 73.2224  -1.434    0.156    
question_typeFictional     -1.9014     0.4056 72.2588  -4.688 1.27e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.729                      
qstn_typSpr -0.724  0.579               
qstn_typFct -0.663  0.534      0.532    
##pairwise contrasts
emm.ecuador <- emmeans(m.ecuador, ~ question_type)
contrast(emm.ecuador, method = "pairwise", adjust = "none")
 contrast                  estimate    SE   df t.ratio p.value
 Ordinary - Scientific      0.53746 0.370 75.2   1.454  0.1501
 Ordinary - Supernatural    0.53225 0.372 74.6   1.432  0.1564
 Ordinary - Fictional       1.90136 0.406 73.7   4.685  <.0001
 Scientific - Supernatural -0.00521 0.342 80.4  -0.015  0.9879
 Scientific - Fictional     1.36390 0.376 76.3   3.624  0.0005
 Supernatural - Fictional   1.36911 0.378 74.8   3.625  0.0005

Degrees-of-freedom method: kenward-roger 
# Peru
m.peru <- lmer(conf_dir ~ question_type + (1|ont_subj), data = filter(df_ext_usens_conf_ALT, ont_ctry_name == "Peru"))
summary(m.peru)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: filter(df_ext_usens_conf_ALT, ont_ctry_name == "Peru")

REML criterion at convergence: 793

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.2876 -0.4473  0.2786  0.3683  2.6448 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.04796  0.219   
 Residual             1.28285  1.133   
Number of obs: 253, groups:  ont_subj, 40

Fixed effects:
                          Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)                 3.7500     0.1824 247.1351  20.559   <2e-16 ***
question_typeScientific    -0.1663     0.2307 215.1638  -0.721    0.472    
question_typeSupernatural  -0.1667     0.2068 211.7962  -0.806    0.421    
question_typeFictional     -2.8167     0.2691 217.8182 -10.467   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.762                      
qstn_typSpr -0.850  0.672               
qstn_typFct -0.653  0.518      0.576    
##pairwise contrasts
emm.peru <- emmeans(m.peru, ~ question_type)
contrast(emm.peru, method = "pairwise", adjust = "none")
 contrast                  estimate    SE  df t.ratio p.value
 Ordinary - Scientific      0.16633 0.231 214   0.721  0.4719
 Ordinary - Supernatural    0.16667 0.207 210   0.806  0.4212
 Ordinary - Fictional       2.81673 0.269 217  10.459  <.0001
 Scientific - Supernatural  0.00034 0.179 216   0.002  0.9985
 Scientific - Fictional     2.65040 0.248 217  10.692  <.0001
 Supernatural - Fictional   2.65006 0.226 219  11.718  <.0001

Degrees-of-freedom method: kenward-roger 

Model predicting confidence x existence scores by category pooling across non-US countries. These results show that when you combine all non-US country responses together, the difference between ordinary and supernatural confidence ratings are significant.

#combinging non us countries
m.non.us <- lmer(conf_dir ~ question_type + (1|ont_ctry_name/ont_subj), data = filter(df_ext_usens_conf_ALT, ont_ctry_name != "US"))
summary(m.non.us)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_ctry_name/ont_subj)
   Data: filter(df_ext_usens_conf_ALT, ont_ctry_name != "US")

REML criterion at convergence: 2293.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.5239 -0.3322  0.2444  0.4483  2.0520 

Random effects:
 Groups                 Name        Variance Std.Dev.
 ont_subj:ont_ctry_name (Intercept) 0.1228   0.3504  
 ont_ctry_name          (Intercept) 0.0000   0.0000  
 Residual                           1.4453   1.2022  
Number of obs: 698, groups:  ont_subj:ont_ctry_name, 130; ont_ctry_name, 3

Fixed effects:
                          Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)                 3.7385     0.1098 674.2405  34.039  < 2e-16 ***
question_typeScientific    -0.3647     0.1366 571.9140  -2.671  0.00779 ** 
question_typeSupernatural  -0.2598     0.1302 578.2497  -1.996  0.04639 *  
question_typeFictional     -2.1671     0.1520 566.5738 -14.255  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) qstn_typSc qstn_typSp
qstn_typScn -0.741                      
qstn_typSpr -0.778  0.623               
qstn_typFct -0.666  0.536      0.561    
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
##pairwise contrasts
emm.non.us <- emmeans(m.non.us, ~ question_type)
contrast(emm.non.us, method = "pairwise", adjust = "none")
 contrast                  estimate    SE  df t.ratio p.value
 Ordinary - Scientific        0.365 0.137 577   2.670  0.0078
 Ordinary - Supernatural      0.260 0.132 561   1.968  0.0495
 Ordinary - Fictional         2.167 0.152 572  14.240  <.0001
 Scientific - Supernatural   -0.105 0.118 581  -0.889  0.3746
 Scientific - Fictional       1.802 0.140 580  12.887  <.0001
 Supernatural - Fictional     1.907 0.137 541  13.951  <.0001

Degrees-of-freedom method: kenward-roger 

Model predicting confidence x existence scores by category, but only for highest contrast ordinary vs. supernatural items (coffee cups & tables vs. God & demons). These results show that these highest contrasts are significantly different in the US and Ghana, but not in Ecuador and Peru (in Ecuador, our smallest sample size, there are hints that this effect might be found in future similar studies). See Appendix A for full confidence and existence ratings broken down by item, version, and country.

# US --mugs, tables, god, demons
m.mug.us <- lmer(conf_dir ~ question_type + (1|ont_subj), data = df_ext_usens_conf_ALT %>% 
               filter(ont_ctry_name == "US",
                      item_code %in% c("mug", "tbl", "dem", "god")))
summary(m.mug.us)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: df_ext_usens_conf_ALT %>% filter(ont_ctry_name == "US", item_code %in%  
    c("mug", "tbl", "dem", "god"))

REML criterion at convergence: 446.7

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.03793  0.01365  0.01586  0.47946  1.31969 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.01493  0.1222  
 Residual             5.65089  2.3772  
Number of obs: 98, groups:  ont_subj, 49

Fixed effects:
                          Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)                 3.9592     0.3400 95.9993  11.643  < 2e-16 ***
question_typeSupernatural  -3.1020     0.4803 48.0380  -6.459 4.95e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
qstn_typSpr -0.706
# Ghana --mugs, tables, god, demons
m.mug.ghana <- lmer(conf_dir ~ question_type + (1|ont_subj), data = df_ext_usens_conf_ALT %>% 
               filter(ont_ctry_name == "Ghana",
                      item_code %in% c("mug", "tbl", "dem", "god")))
summary(m.mug.ghana)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: df_ext_usens_conf_ALT %>% filter(ont_ctry_name == "Ghana", item_code %in%  
    c("mug", "tbl", "dem", "god"))

REML criterion at convergence: 314.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.7306 -0.1313  0.0024  0.5628  1.5196 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.2505   0.5005  
 Residual             0.3438   0.5863  
Number of obs: 140, groups:  ont_subj, 70

Fixed effects:
                           Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)                 3.75714    0.09214 117.17884  40.776  < 2e-16 ***
question_typeSupernatural  -0.32857    0.09911  69.00000  -3.315  0.00146 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
qstn_typSpr -0.538
# Ecuador --mugs, tables, god, Wene
m.mug.ecuador <- lmer(conf_dir ~ question_type + (1|ont_subj), data = df_ext_usens_conf_ALT %>% 
               filter(ont_ctry_name == "Ecuador",
                      item_code %in% c("mug", "tbl", "wen", "god"))) #Wene instead of demon
summary(m.mug.ecuador)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: df_ext_usens_conf_ALT %>% filter(ont_ctry_name == "Ecuador",  
    item_code %in% c("mug", "tbl", "wen", "god"))

REML criterion at convergence: 122

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.0763 -0.2848  0.1576  0.7600  0.9070 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.2116   0.460   
 Residual             1.1538   1.074   
Number of obs: 39, groups:  ont_subj, 20

Fixed effects:
                          Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)                 3.6500     0.2613 36.1945  13.969 3.76e-16 ***
question_typeSupernatural  -0.6471     0.3448 19.0832  -1.877   0.0759 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
qstn_typSpr -0.640
# Peru --mugs, tables, god, Oni Ibo 
m.mug.peru <- lmer(conf_dir ~ question_type + (1|ont_subj), data = df_ext_usens_conf_ALT %>% 
               filter(ont_ctry_name == "Peru",
                      item_code %in% c("taz", "tbl", "oni", "god")))
summary(m.mug.peru)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: conf_dir ~ question_type + (1 | ont_subj)
   Data: df_ext_usens_conf_ALT %>% filter(ont_ctry_name == "Peru", item_code %in%  
    c("taz", "tbl", "oni", "god"))

REML criterion at convergence: 163.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.8913  0.2505  0.2505  0.4187  0.9844 

Random effects:
 Groups   Name        Variance Std.Dev.
 ont_subj (Intercept) 0.08974  0.2996  
 Residual             0.35385  0.5948  
Number of obs: 80, groups:  ont_subj, 40

Fixed effects:
                          Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)                 3.7500     0.1053 74.9330  35.610   <2e-16 ***
question_typeSupernatural  -0.1000     0.1330 39.0000  -0.752    0.457    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
qstn_typSpr -0.632

Appendix A: Responses by object, version, and country

Existence

US

# Just version 1 questions--there are 21 participants
exist_bar(country = "US", version = 1, 
          cols = c("sci_ext_grm", "spn_ext_dem", "ord_ext_mug", "sci_ext_gvt", "fic_ext_smn"), 
          col_names = c("sci_ext_grm" = "Germs",
                           "spn_ext_dem" = "Demons",
                           "ord_ext_mug" = "Coffee Mugs",
                           "sci_ext_gvt" = "Gravity",
                           "fic_ext_smn" = "Superman"), 
          title = "US Version 1 responses to whether objects exist", 
          data = df)



# Version 2 -- 28 participants
exist_bar(country = "US", version = 2, 
          cols = c("sci_ext_cnc", "spn_ext_god", "ord_ext_tbl", "spn_ext_ghs", "fic_ext_hap"), 
          col_names = c("sci_ext_cnc" = "Cancer",
                           "spn_ext_god" = "God",
                           "ord_ext_tbl" = "Tables",
                           "spn_ext_ghs" = "Ghosts",
                           "fic_ext_hap" = "Harry Potter"), 
          title = "US Version 2 responses to whether objects exist", 
          data = df)


#-----------------------------------------
## BOTH VERSIONS COMBINED BY QUESTION TYPE 
us_data_combined <- df %>%
  filter(ont_ctry_name == "US") %>%
  select(sci_ext_grm, spn_ext_dem, ord_ext_mug, sci_ext_gvt, fic_ext_smn,
         sci_ext_cnc, spn_ext_god, ord_ext_tbl, spn_ext_ghs, fic_ext_hap) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           sci_ext_grm = "Scientific",
                           sci_ext_gvt = "Scientific",
                           sci_ext_cnc = "Scientific",
                           ord_ext_mug = "Ordinary",
                           ord_ext_tbl = "Ordinary",
                           spn_ext_god = "Supernatural",
                           spn_ext_dem = "Supernatural",
                           spn_ext_ghs = "Supernatural",
                           fic_ext_hap = "Fictional",
                           fic_ext_smn = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
us_data_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Add % and n
  labs(
    title = "US Ontology Questions--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses"
  )

Ghana

# Version 1 -- 35 participants
exist_bar(country = "Ghana", version = 1, 
          cols = c("sci_ext_grm", "spn_ext_dem", "ord_ext_mug", "sci_ext_frc", "fic_ext_smn"), 
          col_names = c("sci_ext_grm" = "Germs",
                           "spn_ext_dem" = "Demons",
                           "ord_ext_mug" = "Coffee Mugs",
                           "sci_ext_frc" = "Force",
                           "fic_ext_smn" = "Superman"), 
          title = "Ghana Version 1 responses to whether objects exist", 
          data = df)


# Version 2 -- 35 participants
exist_bar(country = "Ghana", version = 2, 
          cols = c("sci_ext_cnc", "spn_ext_god", "ord_ext_tbl", "spn_ext_abs", "fic_ext_kwk"), 
          col_names = c("sci_ext_cnc" = "Cancer",
                           "spn_ext_god" = "God",
                           "ord_ext_tbl" = "Tables",
                           "spn_ext_abs" = "Abosom (small god)",
                           "fic_ext_kwk" = "Kweku Ananse (fic. char.)"), 
          title = "Ghana Version 2 responses to whether objects exist", 
          data = df)


#----------------------
## BOTH VERSIONS COMBINED BY QUESTION TYPE 
gh_data_combined <- df %>%
  filter(ont_ctry_name == "Ghana") %>%
  select(sci_ext_grm, spn_ext_dem, ord_ext_mug, sci_ext_frc, fic_ext_smn,
         sci_ext_cnc, spn_ext_god, ord_ext_tbl, spn_ext_abs, fic_ext_kwk) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           sci_ext_grm = "Scientific",
                           sci_ext_frc = "Scientific",
                           sci_ext_cnc = "Scientific",
                           ord_ext_mug = "Ordinary",
                           ord_ext_tbl = "Ordinary",
                           spn_ext_god = "Supernatural",
                           spn_ext_dem = "Supernatural",
                           spn_ext_abs = "Supernatural",
                           fic_ext_kwk = "Fictional",
                           fic_ext_smn = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
gh_data_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "Ghana Ontology Questions--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Ecuador

# Version 1 -- 10 participants 
exist_bar(country = "Ecuador", version = 1, 
          cols = c("sci_ext_flu", "spn_ext_wen", "ord_ext_mug", "sci_ext_par", "fic_ext_spd"), 
          col_names = c("sci_ext_flu" = "Daicawo (flu)",
                           "spn_ext_wen" = "Wene (demon/forest god)",
                           "ord_ext_mug" = "Coffee Mugs",
                           "sci_ext_par" = "Intestinal Parasites",
                           "fic_ext_spd" = "Spiderman"), 
          title = "Ecuadorian Amazon Version 1 responses to whether objects exist", 
          data = df)


# Version 2 -- 10 participants
exist_bar(country = "Ecuador", version = 2, 
          cols = c("sci_ext_cnc", "spn_ext_god", "ord_ext_tbl", "spn_ext_okw", "fic_ext_ram"), 
          col_names = c("sci_ext_cnc" = "Cancer",
                           "spn_ext_god" = "God",
                           "ord_ext_tbl" = "Tables",
                           "spn_ext_okw" = "Onokawa (ghost)",
                           "fic_ext_ram" = "Rambo"), 
          title = "Ecuadorian Amazon Version 2 responses to whether objects exist", 
          data = df)


#----------------------
## BOTH VERSIONS COMBINED BY QUESTION TYPE 
ec_data_combined <- df %>%
  filter(ont_ctry_name == "Ecuador") %>%
  select(sci_ext_flu, spn_ext_wen, ord_ext_mug, sci_ext_par, fic_ext_spd,
         sci_ext_cnc, spn_ext_god, ord_ext_tbl, spn_ext_okw, fic_ext_ram) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           sci_ext_flu = "Scientific",
                           sci_ext_par = "Scientific",
                           sci_ext_cnc = "Scientific",
                           ord_ext_mug = "Ordinary",
                           ord_ext_tbl = "Ordinary",
                           spn_ext_god = "Supernatural",
                           spn_ext_wen = "Supernatural",
                           spn_ext_okw = "Supernatural",
                           fic_ext_spd = "Fictional",
                           fic_ext_ram = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
ec_data_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "Ecuadorian Amazon Ontology Questions--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Peru

# Version 1 -- 21 participants
exist_bar(country = "Peru", version = 1, 
          cols = c("spn_ext_ysh", "sci_ext_par", "spn_ext_god", "ord_ext_tbl", "fic_ext_njt", "spn_ext_cha", "sci_ext_cnc"), 
          col_names = c("spn_ext_ysh" = "Mahua Yoshin\n(bad spirit)",  
                        "sci_ext_par" = "Intestinal Parasites",  
                        "spn_ext_god" = "God",  
                        "ord_ext_tbl" = "Tables",  
                        "fic_ext_njt" = "Ninja Turtles",  
                        "spn_ext_cha" = "Chaikoni\n(invisible magic humans)",  
                        "sci_ext_cnc" = "Cancer"), 
          title = "Peruvian Amazon Version 1 responses to whether objects exist", 
          data = df)



# Version 2 -- 19 participants
exist_bar(country = "Peru", version = 2, 
          cols = c("sci_ext_grm", "nas_ext_ron", "ord_ext_taz", "spn_ext_oni", "fic_ext_smn", "nas_ext_dlp"), 
          col_names = c("sci_ext_grm" = "Germs", 
                           "nas_ext_ron" = "Ronin\n(Anaconda)",
                           "ord_ext_taz" = "Coffee Mug",
                           "spn_ext_oni" = "Oni Ibo\n(good spirit)",
                           "fic_ext_smn" = "Superman",
                           "nas_ext_dlp" = "Joshin Kokoshka\n(pink river dolphin)"), 
          title = "Peruvian Amazon Version 2 responses to whether objects exist", 
          data = df)



#----------------------
# BOTH VERSIONS COMBINED

peru_data_combined <- df %>%
  filter(ont_ctry_name == "Peru") %>%
  select(spn_ext_ysh, sci_ext_par, spn_ext_god, ord_ext_tbl, fic_ext_njt, spn_ext_cha, sci_ext_cnc,
         sci_ext_grm, nas_ext_ron, ord_ext_taz, spn_ext_oni, fic_ext_smn, nas_ext_dlp) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           sci_ext_par = "Scientific",
                           sci_ext_cnc = "Scientific",
                           sci_ext_grm = "Scientific",
                           ord_ext_taz = "Ordinary",
                           ord_ext_tbl = "Ordinary",
                           spn_ext_ysh = "Supernatural",
                           spn_ext_god = "Supernatural",
                           spn_ext_cha = "Supernatural",
                           nas_ext_ron = "Supernatural",
                           spn_ext_oni = "Supernatural", 
                           nas_ext_dlp = "Supernatural",
                           fic_ext_njt = "Fictional",
                           fic_ext_smn = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
peru_data_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "Peru Amazon Ontology Questions--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Confidence

US

# Version 1--21 participants
conf_bar_by_existence(
  country = "US",
  version = 1,
  conf_cols = c(
    "sci_conf.ext_grm", "spn_conf.ext_dem", "ord_conf.ext_mug", "sci_conf.ext_gvt", "fic_conf.ext_smn"
  ),
  exist_cols = c(
    "sci_ext_grm", "spn_ext_dem", "ord_ext_mug", "sci_ext_gvt", "fic_ext_smn"
  ),
  col_names = c(
    "sci_conf.ext_grm" = "Germs",
    "spn_conf.ext_dem" = "Demons",
    "ord_conf.ext_mug" = "Coffee Mugs",
    "sci_conf.ext_gvt" = "Gravity",
    "fic_conf.ext_smn" = "Superman"
  ),
  title = "US V1: Confidence by Belief"
)


# Version 2 -- 28 participants
conf_bar_by_existence(
  country = "US",
  version = 2,
  conf_cols = c(
    "sci_conf.ext_cnc", "spn_conf.ext_god", "ord_conf.ext_tbl", "spn_conf.ext_ghs", "fic_conf.ext_hap"
  ),
  exist_cols = c(
    "sci_ext_cnc", "spn_ext_god", "ord_ext_tbl", "spn_ext_ghs", "fic_ext_hap"
  ),
  col_names = c(
    "sci_conf.ext_cnc" = "Cancer",
    "spn_conf.ext_god" = "God",
    "ord_conf.ext_tbl" = "Tables",
    "spn_conf.ext_ghs" = "Ghosts",
    "fic_conf.ext_hap" = "Harry Potter"
  ),
  title = "US V2: Confidence by Belief"
)

Ghana

# Version 1 -- 35 participants
conf_bar_by_existence(
  country = "Ghana",
  version = 1,
  conf_cols = c(
    "sci_conf.ext_grm", "spn_conf.ext_dem", "ord_conf.ext_mug", "sci_conf.ext_frc", "fic_conf.ext_smn"
  ),
  exist_cols = c(
    "sci_ext_grm", "spn_ext_dem", "ord_ext_mug", "sci_ext_frc", "fic_ext_smn"
  ),
  col_names = c(
    "sci_conf.ext_grm" = "Germs",
    "spn_conf.ext_dem" = "Demons",
    "ord_conf.ext_mug" = "Coffee Mugs",
    "sci_conf.ext_frc" = "Force",
    "fic_conf.ext_smn" = "Superman"
  ),
  title = "Ghana V1: Confidence by Belief"
)


# Version 2 -- 35 participants
conf_bar_by_existence(
  country = "Ghana",
  version = 2,
  conf_cols = c(
    "sci_conf.ext_cnc", "spn_conf.ext_god", "ord_conf.ext_tbl", "spn_conf.ext_abs", "fic_conf.ext_kwk"
  ),
  exist_cols = c(
    "sci_ext_cnc", "spn_ext_god", "ord_ext_tbl", "spn_ext_abs", "fic_ext_kwk"
  ),
  col_names = c(
    "sci_conf.ext_cnc" = "Cancer",
    "spn_conf.ext_god" = "God",
    "ord_conf.ext_tbl" = "Tables",
    "spn_conf.ext_abs" = "Abosom\n(small god)",
    "fic_conf.ext_kwk" = "Kweku Ananse\n(fic. char.)"
  ),
  title = "Ghana V2: Confidence by Belief"
)

Ecuador

# V1 10 participants 
conf_bar_by_existence(
  country = "Ecuador",
  version = 1,
  conf_cols = c(
    "sci_conf.ext_flu", "spn_conf.ext_wen", "ord_conf.ext_mug", "sci_conf.ext_par", "fic_conf.ext_spd"
  ),
  exist_cols = c(
    "sci_ext_flu", "spn_ext_wen", "ord_ext_mug", "sci_ext_par", "fic_ext_spd"
  ),
  col_names = c(
    "sci_conf.ext_flu" = "Daicawo (flu)",
    "spn_conf.ext_wen" = "Wene\n(demon/forest god)",
    "ord_conf.ext_mug" = "Coffee Mugs",
    "sci_conf.ext_par" = "Intestinal Parasites",
    "fic_conf.ext_spd" = "Spiderman"
  ),
  title = "Ecuadorian Amazon V1: Confidence by Belief"
)


# V2 10 participants
conf_bar_by_existence(
  country = "Ecuador",
  version = 2,
  conf_cols = c(
    "sci_conf.ext_cnc", "spn_conf.ext_god", "ord_conf.ext_tbl", "spn_conf.ext_okw", "fic_conf.ext_ram"
  ),
  exist_cols = c(
    "sci_ext_cnc", "spn_ext_god", "ord_ext_tbl", "spn_ext_okw", "fic_ext_ram"
  ),
  col_names = c(
    "sci_conf.ext_cnc" = "Cancer",
    "spn_conf.ext_god" = "God",
    "ord_conf.ext_tbl" = "Tables",
    "spn_conf.ext_okw" = "Onokawa\n(ghost)",
    "fic_conf.ext_ram" = "Rambo"
  ),
  title = "Ecuadorian Amazon V2: Confidence by Belief"
)

Peru

# V1 -- 21 participants
conf_bar_by_existence(
  country = "Peru",
  version = 1,
  conf_cols = c(
    "spn_conf.ext_ysh", "sci_conf.ext_par", "spn_conf.ext_god", "ord_conf.ext_tbl", "fic_conf.ext_njt", 
    "spn_conf.ext_cha", "sci_conf.ext_cnc"
  ),
  exist_cols = c(
    "spn_ext_ysh", "sci_ext_par", "spn_ext_god", "ord_ext_tbl", "fic_ext_njt", "spn_ext_cha", "sci_ext_cnc"
  ),
  col_names = c(
    "spn_conf.ext_ysh" = "Mahua Yoshin\n(bad spirit)",
    "sci_conf.ext_par" = "Intestinal Parasites",
    "spn_conf.ext_god" = "God",
    "ord_conf.ext_tbl" = "Tables",
    "fic_conf.ext_njt" = "Ninja Turtles",
    "spn_conf.ext_cha" = "Chaikoni\n(invisible magic humans)",
    "sci_conf.ext_cnc" = "Cancer"
  ),
  title = "Peruvian Amazon V1: Confidence by Belief"
)



# V2 -- 19 participants
conf_bar_by_existence(
  country = "Peru",
  version = 2,
  conf_cols = c(
    "sci_conf.ext_grm", "nas_conf.ext_ron", "ord_conf.ext_taz", "spn_conf.ext_oni", "fic_conf.ext_smn", "nas_conf.ext_dlp"
  ),
  exist_cols = c(
    "sci_ext_grm", "nas_ext_ron", "ord_ext_taz", "spn_ext_oni", "fic_ext_smn", "nas_ext_dlp"
  ),
  col_names = c(
    "sci_conf.ext_grm" = "Germs",
    "nas_conf.ext_ron" = "Ronin\n(Anaconda)",
    "ord_conf.ext_taz" = "Coffee Mug",
    "spn_conf.ext_oni" = "Oni Ibo\n(good spirit)",
    "fic_conf.ext_smn" = "Superman",
    "nas_conf.ext_dlp" = "Joshin Kokoshka\n(pink river dolphin)"
  ),
  title = "Peruvian Amazon V2: Confidence by Belief"
)

Communication

US

yn_stacked_bar(country = "US", version = 1, 
                 cols = c("sci_comu_grm", "spn_comu_dem", "ord_comu_mug", "sci_comu_gvt", "fic_comu_smn"), 
                 col_names = c("sci_comu_grm" = "Germs",
                           "spn_comu_dem" = "Demons",
                           "ord_comu_mug" = "Coffee Mugs",
                           "sci_comu_gvt" = "Gravity",
                           "fic_comu_smn" = "Superman"), 
                 title = "US V1: Can people communicate with __?")


# Version 2 -- 28 participants
yn_stacked_bar(country = "US", version = 2, 
                 cols = c("sci_comu_cnc", "spn_comu_god", "ord_comu_tbl", "spn_comu_ghs", "fic_comu_hap"), 
                 col_names = c("sci_comu_cnc" = "Cancer",
                           "spn_comu_god" = "God",
                          "ord_comu_tbl" = "Tables",
                           "spn_comu_ghs" = "Ghosts",
                           "fic_comu_hap" = "Harry Potter"), 
                 title = "US V2: Can people communicate with __?")


# Both versions together
yn_by_category(country = "US", 
                 cols = c("sci_comu_grm", "spn_comu_dem", "ord_comu_mug", "sci_comu_gvt", "fic_comu_smn",
                          "sci_comu_cnc", "spn_comu_god", "ord_comu_tbl", "spn_comu_ghs", "fic_comu_hap"),
                 category_mapping = c("sci_comu_grm" = "Scientific",
                           "spn_comu_dem" = "Supernatural",
                           "ord_comu_mug" = "Ordinary",
                           "sci_comu_gvt" = "Scientific",
                           "fic_comu_smn" = "Fictional",
                           "sci_comu_cnc" = "Scientific",
                           "spn_comu_god" = "Supernatural",
                           "ord_comu_tbl" = "Ordinary",
                           "spn_comu_ghs" = "Supernatural",
                           "fic_comu_hap" = "Fictional"),
                 title = "US: Can people communicate with __?"
                 )

Ghana

# Version 1 -- 35 participants by item and version
yn_stacked_bar(country = "Ghana", version = 1, 
                 cols = c("sci_comu_grm", "spn_comu_dem", "ord_comu_mug", "sci_comu_frc", "fic_comu_smn"), 
                 col_names = c("sci_comu_grm" = "Germs",
                           "spn_comu_dem" = "Demons",
                           "ord_comu_mug" = "Coffee Mugs",
                           "sci_comu_frc" = "Force",
                           "fic_comu_smn" = "Superman"), 
                 title = "Ghana V1: Can people communicate with __?")


# Version 2 -- 35 participants by item and version
yn_stacked_bar(country = "Ghana", version = 2, 
                 cols = c("sci_comu_cnc", "spn_comu_god", "ord_comu_tbl", "spn_comu_abs", "fic_comu_kwk"), 
                 col_names = c("sci_comu_cnc" = "Cancer",
                           "spn_comu_god" = "God",
                           "ord_comu_tbl" = "Tables",
                           "spn_comu_abs" = "Abosom\n(small god)",
                           "fic_comu_kwk" = "Kweku Ananse\n(fic. char.)"), 
                 title = "Ghana V2: Can people communicate with __?")


# Both versions together
yn_by_category(country = "Ghana", 
                 cols = c("sci_comu_grm", "spn_comu_dem", "ord_comu_mug", "sci_comu_frc", "fic_comu_smn",
                          "sci_comu_cnc", "spn_comu_god", "ord_comu_tbl", "spn_comu_abs", "fic_comu_kwk"),
                 category_mapping = c("sci_comu_grm" = "Scientific",
                           "spn_comu_dem" = "Supernatural",
                           "ord_comu_mug" = "Ordinary",
                           "sci_comu_frc" = "Scientific",
                           "fic_comu_smn" = "Fictional",
                           "sci_comu_cnc" = "Scientific",
                           "spn_comu_god" = "Supernatural",
                           "ord_comu_tbl" = "Ordinary",
                           "spn_comu_abs" = "Supernatural",
                           "fic_comu_kwk" = "Fictional"),
                 title = "Ghana: Can people communicate with __?"
                 )

Ecuador

# Version 1 -- 10 participants 
yn_stacked_bar(country = "Ecuador", version = 1, 
                 cols = c("sci_comu_flu", "spn_comu_wen", "ord_comu_mug", "sci_comu_par", "fic_comu_spd"), 
                 col_names = c("sci_comu_flu" = "Daicawo (flu)",
                           "spn_comu_wen" = "Wene\n(demon/forest god)",
                           "ord_comu_mug" = "Coffee Mugs",
                           "sci_comu_par" = "Intestinal Parasites",
                           "fic_comu_spd" = "Spiderman"), 
                 title = "Ecuadorian Amazon V1: Can people communicate with __?")


# Version 2 -- 10 participants
yn_stacked_bar(country = "Ecuador", version = 2, 
                 cols = c("sci_comu_cnc", "spn_comu_god", "ord_comu_tbl", "spn_comu_okw", "fic_comu_ram"), 
                 col_names = c("sci_comu_cnc" = "Cancer",
                           "spn_comu_god" = "God",
                           "ord_comu_tbl" = "Tables",
                           "spn_comu_okw" = "Onokawa\n(ghost)",
                           "fic_comu_ram" = "Rambo"), 
                 title = "Ecuadorian Amazon V2: Can people communicate with __?")


# Both versions together
yn_by_category(country = "Ecuador", 
                 cols = c("sci_comu_flu", "spn_comu_wen", "ord_comu_mug", "sci_comu_par", "fic_comu_spd",
                          "sci_comu_cnc", "spn_comu_god", "ord_comu_tbl", "spn_comu_okw", "fic_comu_ram"),
                 category_mapping = c("sci_comu_flu" = "Scientific",
                           "spn_comu_wen" = "Supernatural",
                           "ord_comu_mug" = "Ordinary",
                           "sci_comu_par" = "Scientific",
                           "fic_comu_spd" = "Fictional",
                           "sci_comu_cnc" = "Scientific",
                           "spn_comu_god" = "Supernatural",
                           "ord_comu_tbl" = "Ordinary",
                           "spn_comu_okw" = "Supernatural",
                           "fic_comu_ram" = "Fictional"),
                 title = "Ecuadorian Amazon: Can people communicate with __?"
                 )

Peru

# Version 1 -- 21 participants
yn_stacked_bar(country = "Peru", version = 1, 
                 cols = c("spn_comu_ysh", "sci_comu_par", "spn_comu_god", "ord_comu_tbl", 
                          "fic_comu_njt", "spn_comu_cha", "sci_comu_cnc"), 
                 col_names = c("spn_comu_ysh" = "Mahua Yoshin\n(bad spirit)",  
                        "sci_comu_par" = "Intestinal Parasites",  
                        "spn_comu_god" = "God",  
                        "ord_comu_tbl" = "Tables",  
                        "fic_comu_njt" = "Ninja Turtles",  
                        "spn_comu_cha" = "Chaikoni\n(invisible magic humans)",  
                        "sci_comu_cnc" = "Cancer"), 
                 title = "Peruvian Amazon V1: Can people communicate with __?")


# Version 2 -- 19 participants
yn_stacked_bar(country = "Peru", version = 2, 
                 cols = c("sci_comu_grm", "nas_comu_ron", "ord_comu_taz", "spn_comu_oni", 
                          "fic_comu_smn", "nas_comu_dlp"), 
                 col_names = c("sci_comu_grm" = "Germs", 
                           "nas_comu_ron" = "Ronin\n(Anaconda)",
                           "ord_comu_taz" = "Coffee Mug",
                           "spn_comu_oni" = "Oni Ibo\n(good spirit)",
                           "fic_comu_smn" = "Superman",
                           "nas_comu_dlp" = "Joshin Kokoshka\n(pink river dolphin)"), 
                 title = "Peruvian Amazon V2: Can people communicate with __?")


# Both versions together
yn_by_category(country = "Peru", 
                 cols = c("spn_comu_ysh", "sci_comu_par", "spn_comu_god", "ord_comu_tbl", 
                          "fic_comu_njt", "spn_comu_cha", "sci_comu_cnc",
                          "sci_comu_grm", "nas_comu_ron", "ord_comu_taz", "spn_comu_oni", 
                          "fic_comu_smn", "nas_comu_dlp"),
                 category_mapping = c("spn_comu_ysh" = "Supernatural",  
                        "sci_comu_par" = "Scientific",  
                        "spn_comu_god" = "Supernatural",  
                        "ord_comu_tbl" = "Ordinary",  
                        "fic_comu_njt" = "Fictional",  
                        "spn_comu_cha" = "Supernatural",  
                        "sci_comu_cnc" = "Scientific",
                        "sci_comu_grm" = "Scientific", 
                        "nas_comu_ron" = "Supernatural",
                        "ord_comu_taz" = "Ordinary",
                        "spn_comu_oni" = "Supernatural",
                        "fic_comu_smn" = "Fictional",
                        "nas_comu_dlp" = "Supernatural"),
                 title = "Peruvian Amazon: Can people communicate with __?"
                 )

Special People

US

spexp_stacked_bar(country = "US", version = 1, 
                 cols = c("sci_spexp_grm", "spn_spexp_dem", "ord_spexp_mug", "sci_spexp_gvt", "fic_spexp_smn"), 
                 col_names = c("sci_spexp_grm" = "Germs",
                           "spn_spexp_dem" = "Demons",
                           "ord_spexp_mug" = "Coffee Mugs",
                           "sci_spexp_gvt" = "Gravity",
                           "fic_spexp_smn" = "Superman"), 
                 title = "US V1: Can __ be experienced by anyone or only by specific people?")


# Version 2 -- 28 participants
spexp_stacked_bar(country = "US", version = 2, 
                 cols = c("sci_spexp_cnc", "spn_spexp_god", "ord_spexp_tbl", "spn_spexp_ghs", "fic_spexp_hap"), 
                 col_names = c("sci_spexp_cnc" = "Cancer",
                           "spn_spexp_god" = "God",
                          "ord_spexp_tbl" = "Tables",
                           "spn_spexp_ghs" = "Ghosts",
                           "fic_spexp_hap" = "Harry Potter"), 
                 title = "US V2: Can __ be experienced by anyone or only by specific people?")


# Both versions together
spexp_by_category(country = "US", 
                 cols = c("sci_spexp_grm", "spn_spexp_dem", "ord_spexp_mug", "sci_spexp_gvt", "fic_spexp_smn",
                          "sci_spexp_cnc", "spn_spexp_god", "ord_spexp_tbl", "spn_spexp_ghs", "fic_spexp_hap"),
                 category_mapping = c("sci_spexp_grm" = "Scientific",
                           "spn_spexp_dem" = "Supernatural",
                           "ord_spexp_mug" = "Ordinary",
                           "sci_spexp_gvt" = "Scientific",
                           "fic_spexp_smn" = "Fictional",
                           "sci_spexp_cnc" = "Scientific",
                           "spn_spexp_god" = "Supernatural",
                           "ord_spexp_tbl" = "Ordinary",
                           "spn_spexp_ghs" = "Supernatural",
                           "fic_spexp_hap" = "Fictional"),
                 title = "US: Can __ be experienced by anyone or only by specific people?"
                 )

Ghana

This question was not asked in Ghana

Ecuador

# Version 1 -- 10 participants 
spexp_stacked_bar(country = "Ecuador", version = 1, 
                 cols = c("sci_spexp_flu", "spn_spexp_wen", "ord_spexp_mug", "sci_spexp_par", "fic_spexp_spd"), 
                 col_names = c("sci_spexp_flu" = "Daicawo (flu)",
                           "spn_spexp_wen" = "Wene\n(demon/forest god)",
                           "ord_spexp_mug" = "Coffee Mugs",
                           "sci_spexp_par" = "Intestinal Parasites",
                           "fic_spexp_spd" = "Spiderman"), 
                 title = "Ecuadorian Amazon V1: Can __ be experienced by anyone or only by specific people?")


# Version 2 -- 10 participants
spexp_stacked_bar(country = "Ecuador", version = 2, 
                 cols = c("sci_spexp_cnc", "spn_spexp_god", "ord_spexp_tbl", "spn_spexp_okw", "fic_spexp_ram"), 
                 col_names = c("sci_spexp_cnc" = "Cancer",
                           "spn_spexp_god" = "God",
                           "ord_spexp_tbl" = "Tables",
                           "spn_spexp_okw" = "Onokawa\n(ghost)",
                           "fic_spexp_ram" = "Rambo"), 
                 title = "Ecuadorian Amazon V2: Can __ be experienced by anyone or only by specific people?")


# Both versions together
spexp_by_category(country = "Ecuador", 
                 cols = c("sci_spexp_flu", "spn_spexp_wen", "ord_spexp_mug", "sci_spexp_par", "fic_spexp_spd",
                          "sci_spexp_cnc", "spn_spexp_god", "ord_spexp_tbl", "spn_spexp_okw", "fic_spexp_ram"),
                 category_mapping = c("sci_spexp_flu" = "Scientific",
                           "spn_spexp_wen" = "Supernatural",
                           "ord_spexp_mug" = "Ordinary",
                           "sci_spexp_par" = "Scientific",
                           "fic_spexp_spd" = "Fictional",
                           "sci_spexp_cnc" = "Scientific",
                           "spn_spexp_god" = "Supernatural",
                           "ord_spexp_tbl" = "Ordinary",
                           "spn_spexp_okw" = "Supernatural",
                           "fic_spexp_ram" = "Fictional"),
                 title = "Ecuadorian Amazon: Can __ be experienced by anyone or only by specific people?"
                 )

Peru

# Version 1 -- 21 participants
spexp_stacked_bar(country = "Peru", version = 1, 
                 cols = c("spn_spexp_ysh", "sci_spexp_par", "spn_spexp_god", "ord_spexp_tbl", 
                          "fic_spexp_njt", "spn_spexp_cha", "sci_spexp_cnc"), 
                 col_names = c("spn_spexp_ysh" = "Mahua Yoshin\n(bad spirit)",  
                        "sci_spexp_par" = "Intestinal Parasites",  
                        "spn_spexp_god" = "God",  
                        "ord_spexp_tbl" = "Tables",  
                        "fic_spexp_njt" = "Ninja Turtles",  
                        "spn_spexp_cha" = "Chaikoni\n(invisible magic humans)",  
                        "sci_spexp_cnc" = "Cancer"), 
                 title = "Peruvian Amazon V1: Can __ be experienced by anyone or only by specific people?")


# Version 2 -- 19 participants
spexp_stacked_bar(country = "Peru", version = 2, 
                 cols = c("sci_spexp_grm", "nas_spexp_ron", "ord_spexp_taz", "spn_spexp_oni", 
                          "fic_spexp_smn", "nas_spexp_dlp"), 
                 col_names = c("sci_spexp_grm" = "Germs", 
                           "nas_spexp_ron" = "Ronin\n(Anaconda)",
                           "ord_spexp_taz" = "Coffee Mug",
                           "spn_spexp_oni" = "Oni Ibo\n(good spirit)",
                           "fic_spexp_smn" = "Superman",
                           "nas_spexp_dlp" = "Joshin Kokoshka\n(pink river dolphin)"), 
                 title = "Peruvian Amazon V2: Can __ be experienced by anyone or only by specific people?")


# Both versions together
spexp_by_category(country = "Peru", 
                 cols = c("spn_spexp_ysh", "sci_spexp_par", "spn_spexp_god", "ord_spexp_tbl", 
                          "fic_spexp_njt", "spn_spexp_cha", "sci_spexp_cnc",
                          "sci_spexp_grm", "nas_spexp_ron", "ord_spexp_taz", "spn_spexp_oni", 
                          "fic_spexp_smn", "nas_spexp_dlp"),
                 category_mapping = c("spn_spexp_ysh" = "Supernatural",  
                        "sci_spexp_par" = "Scientific",  
                        "spn_spexp_god" = "Supernatural",  
                        "ord_spexp_tbl" = "Ordinary",  
                        "fic_spexp_njt" = "Fictional",  
                        "spn_spexp_cha" = "Supernatural",  
                        "sci_spexp_cnc" = "Scientific",
                        "sci_spexp_grm" = "Scientific", 
                        "nas_spexp_ron" = "Supernatural",
                        "ord_spexp_taz" = "Ordinary",
                        "spn_spexp_oni" = "Supernatural",
                        "fic_spexp_smn" = "Fictional",
                        "nas_spexp_dlp" = "Supernatural"),
                 title = "Peruvian Amazon: Can __ be experienced by anyone or only by specific people?"
                 )

Can X be sensed?

US

# Just version 1 questions--there are 21 participants
exist_bar(country = "US", version = 1, 
          cols = c("sens_grm", "sens_dem", "sens_mug", "sens_gvt", "sens_smn"), 
          col_names = c("sens_grm" = "Germs",
                           "sens_dem" = "Demons",
                           "sens_mug" = "Coffee Mugs",
                           "sens_gvt" = "Gravity",
                           "sens_smn" = "Superman"), 
          title = "US Version 1--Can __ be sensed?", 
          data = df_sens)



# Version 2 -- 28 participants
exist_bar(country = "US", version = 2, 
          cols = c("sens_cnc", "sens_god", "sens_tbl", "sens_ghs", "sens_hap"), 
          col_names = c("sens_cnc" = "Cancer",
                           "sens_god" = "God",
                           "sens_tbl" = "Tables",
                           "sens_ghs" = "Ghosts",
                           "sens_hap" = "Harry Potter"), 
          title = "US Version 2--Can __ be sensed?", 
          data = df_sens)


#-----------------------------------------
## BOTH VERSIONS COMBINED BY QUESTION TYPE 
us_sens_combined <- df_sens %>%
  filter(ont_ctry_name == "US") %>%
  select(sens_grm, sens_dem, sens_mug, sens_gvt, sens_smn,
         sens_cnc, sens_god, sens_tbl, sens_ghs, sens_hap) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           sens_grm = "Scientific",
                           sens_gvt = "Scientific",
                           sens_cnc = "Scientific",
                           sens_mug = "Ordinary",
                           sens_tbl = "Ordinary",
                           sens_god = "Supernatural",
                           sens_dem = "Supernatural",
                           sens_ghs = "Supernatural",
                           sens_hap = "Fictional",
                           sens_smn = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
us_sens_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "US: Can __ be sensed?--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Ghana

# Version 1 -- 35 participants
exist_bar(country = "Ghana", version = 1, 
          cols = c("sens_grm", "sens_dem", "sens_mug", "sens_frc", "sens_smn"), 
          col_names = c("sens_grm" = "Germs",
                           "sens_dem" = "Demons",
                           "sens_mug" = "Coffee Mugs",
                           "sens_frc" = "Force",
                           "sens_smn" = "Superman"), 
          title = "Ghana Version 1--Can __ be sensed?", 
          data = df_sens)


# Version 2 -- 35 participants
exist_bar(country = "Ghana", version = 2, 
          cols = c("sens_cnc", "sens_god", "sens_tbl", "sens_abs", "sens_kwk"), 
          col_names = c("sens_cnc" = "Cancer",
                           "sens_god" = "God",
                           "sens_tbl" = "Tables",
                           "sens_abs" = "Abosom (small god)",
                           "sens_kwk" = "Kweku Ananse (fic. char.)"), 
          title = "Ghana Version 2--Can __ be sensed?", 
          data = df_sens)


#----------------------
## BOTH VERSIONS COMBINED BY QUESTION TYPE 
gh_sens_combined <- df_sens %>%
  filter(ont_ctry_name == "Ghana") %>%
  select(sens_grm, sens_dem, sens_mug, sens_frc, sens_smn,
         sens_cnc, sens_god, sens_tbl, sens_abs, sens_kwk) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           sens_grm = "Scientific",
                           sens_frc = "Scientific",
                           sens_cnc = "Scientific",
                           sens_mug = "Ordinary",
                           sens_tbl = "Ordinary",
                           sens_god = "Supernatural",
                           sens_dem = "Supernatural",
                           sens_abs = "Supernatural",
                           sens_kwk = "Fictional",
                           sens_smn = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
gh_sens_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "Ghana: Can __ be sensed?--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Ecuador

# Version 1 -- 10 participants 
exist_bar(country = "Ecuador", version = 1, 
          cols = c("sens_flu", "sens_wen", "sens_mug", "sens_par", "sens_spd"), 
          col_names = c("sens_flu" = "Daicawo (flu)",
                           "sens_wen" = "Wene (demon/forest god)",
                           "sens_mug" = "Coffee Mugs",
                           "sens_par" = "Intestinal Parasites",
                           "sens_spd" = "Spiderman"), 
          title = "Ecuadorian Amazon Version 1--Can __ be sensed?", 
          data = df_sens)


# Version 2 -- 10 participants
exist_bar(country = "Ecuador", version = 2, 
          cols = c("sens_cnc", "sens_god", "sens_tbl", "sens_okw", "sens_ram"), 
          col_names = c("sens_cnc" = "Cancer",
                           "sens_god" = "God",
                           "sens_tbl" = "Tables",
                           "sens_okw" = "Onokawa (ghost)",
                           "sens_ram" = "Rambo"), 
          title = "Ecuadorian Amazon Version 2--Can __ be sensed?", 
          data = df_sens)


#----------------------
## BOTH VERSIONS COMBINED BY QUESTION TYPE 
ec_sens_combined <- df_sens %>%
  filter(ont_ctry_name == "Ecuador") %>%
  select(sens_flu, sens_wen, sens_mug, sens_par, sens_spd,
         sens_cnc, sens_god, sens_tbl, sens_okw, sens_ram) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           sens_flu = "Scientific",
                           sens_par = "Scientific",
                           sens_cnc = "Scientific",
                           sens_mug = "Ordinary",
                           sens_tbl = "Ordinary",
                           sens_god = "Supernatural",
                           sens_wen = "Supernatural",
                           sens_okw = "Supernatural",
                           sens_spd = "Fictional",
                           sens_ram = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
ec_sens_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "Ecuadorian Amazon:Can __ be sensed?--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Peru

# Version 1 -- 21 participants
exist_bar(country = "Peru", version = 1, 
          cols = c("sens_ysh", "sens_par", "sens_god", "sens_tbl", "sens_njt", "sens_cha", "sens_cnc"), 
          col_names = c("sens_ysh" = "Mahua Yoshin\n(bad spirit)",  
                        "sens_par" = "Intestinal Parasites",  
                        "sens_god" = "God",  
                        "sens_tbl" = "Tables",  
                        "sens_njt" = "Ninja Turtles",  
                        "sens_cha" = "Chaikoni\n(invisible magic humans)",  
                        "sens_cnc" = "Cancer"), 
          title = "Peruvian Amazon Version 1--Can __ be sensed?", 
          data = df_sens)



# Version 2 -- 19 participants
exist_bar(country = "Peru", version = 2, 
          cols = c("sens_grm", "sens_ron", "sens_taz", "sens_oni", "sens_smn", "sens_dlp"), 
          col_names = c("sens_grm" = "Germs", 
                           "sens_ron" = "Ronin\n(Anaconda)",
                           "sens_taz" = "Coffee Mug",
                           "sens_oni" = "Oni Ibo\n(good spirit)",
                           "sens_smn" = "Superman",
                           "sens_dlp" = "Joshin Kokoshka\n(pink river dolphin)"), 
          title = "Peruvian Amazon Version 2--Can __ be sensed?", 
          data = df_sens)



#----------------------
# BOTH VERSIONS COMBINED

peru_sens_combined <- df_sens %>%
  filter(ont_ctry_name == "Peru") %>%
  select(sens_ysh, sens_par, sens_god, sens_tbl, sens_njt, sens_cha, sens_cnc,
         sens_grm, sens_ron, sens_taz, sens_oni, sens_smn, sens_dlp) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           sens_par = "Scientific",
                           sens_cnc = "Scientific",
                           sens_grm = "Scientific",
                           sens_taz = "Ordinary",
                           sens_tbl = "Ordinary",
                           sens_ysh = "Supernatural",
                           sens_god = "Supernatural",
                           sens_cha = "Supernatural",
                           sens_ron = "Supernatural",
                           sens_oni = "Supernatural", 
                           sens_dlp = "Supernatural",
                           sens_njt = "Fictional",
                           sens_smn = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
peru_sens_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "Ecuadorian Amazon:Can __ be sensed?--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Have you ever sensed X?

US

# Just version 1 questions--there are 21 participants
exist_bar(country = "US", version = 1, 
          cols = c("usens_grm", "usens_dem", "usens_mug", "usens_gvt", "usens_smn"), 
          col_names = c("usens_grm" = "Germs",
                           "usens_dem" = "Demons",
                           "usens_mug" = "Coffee Mugs",
                           "usens_gvt" = "Gravity",
                           "usens_smn" = "Superman"), 
          title = "US Version 1--Have you ever sensed __?", 
          data = df_usens)



# Version 2 -- 28 participants
exist_bar(country = "US", version = 2, 
          cols = c("usens_cnc", "usens_god", "usens_tbl", "usens_ghs", "usens_hap"), 
          col_names = c("usens_cnc" = "Cancer",
                           "usens_god" = "God",
                           "usens_tbl" = "Tables",
                           "usens_ghs" = "Ghosts",
                           "usens_hap" = "Harry Potter"), 
          title = "US Version 2--Have you ever sensed __?", 
          data = df_usens)


#-----------------------------------------
## BOTH VERSIONS COMBINED BY QUESTION TYPE 
us_usens_combined <- df_usens %>%
  filter(ont_ctry_name == "US") %>%
  select(usens_grm, usens_dem, usens_mug, usens_gvt, usens_smn,
         usens_cnc, usens_god, usens_tbl, usens_ghs, usens_hap) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           usens_grm = "Scientific",
                           usens_gvt = "Scientific",
                           usens_cnc = "Scientific",
                           usens_mug = "Ordinary",
                           usens_tbl = "Ordinary",
                           usens_god = "Supernatural",
                           usens_dem = "Supernatural",
                           usens_ghs = "Supernatural",
                           usens_hap = "Fictional",
                           usens_smn = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
us_usens_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "US: Have you ever sensed __?--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Ghana

# Version 1 -- 35 participants
exist_bar(country = "Ghana", version = 1, 
          cols = c("usens_grm", "usens_dem", "usens_mug", "usens_frc", "usens_smn"), 
          col_names = c("usens_grm" = "Germs",
                           "usens_dem" = "Demons",
                           "usens_mug" = "Coffee Mugs",
                           "usens_frc" = "Force",
                           "usens_smn" = "Superman"), 
          title = "Ghana Version 1--Have you ever sensed __?", 
          data = df_usens)


# Version 2 -- 35 participants
exist_bar(country = "Ghana", version = 2, 
          cols = c("usens_cnc", "usens_god", "usens_tbl", "usens_abs", "usens_kwk"), 
          col_names = c("usens_cnc" = "Cancer",
                           "usens_god" = "God",
                           "usens_tbl" = "Tables",
                           "usens_abs" = "Abosom (small god)",
                           "usens_kwk" = "Kweku Ananse (fic. char.)"), 
          title = "Ghana Version 2--Have you ever sensed __?", 
          data = df_usens)


#----------------------
## BOTH VERSIONS COMBINED BY QUESTION TYPE 
gh_usens_combined <- df_usens %>%
  filter(ont_ctry_name == "Ghana") %>%
  select(usens_grm, usens_dem, usens_mug, usens_frc, usens_smn,
         usens_cnc, usens_god, usens_tbl, usens_abs, usens_kwk) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           usens_grm = "Scientific",
                           usens_frc = "Scientific",
                           usens_cnc = "Scientific",
                           usens_mug = "Ordinary",
                           usens_tbl = "Ordinary",
                           usens_god = "Supernatural",
                           usens_dem = "Supernatural",
                           usens_abs = "Supernatural",
                           usens_kwk = "Fictional",
                           usens_smn = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
gh_usens_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "Ghana: Have you ever sensed __?--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Ecuador

# Version 1 -- 10 participants 
exist_bar(country = "Ecuador", version = 1, 
          cols = c("usens_flu", "usens_wen", "usens_mug", "usens_par", "usens_spd"), 
          col_names = c("usens_flu" = "Daicawo (flu)",
                           "usens_wen" = "Wene (demon/forest god)",
                           "usens_mug" = "Coffee Mugs",
                           "usens_par" = "Intestinal Parasites",
                           "usens_spd" = "Spiderman"), 
          title = "Ecuadorian Amazon Version 1--Have you ever sensed __?", 
          data = df_usens)


# Version 2 -- 10 participants
exist_bar(country = "Ecuador", version = 2, 
          cols = c("usens_cnc", "usens_god", "usens_tbl", "usens_okw", "usens_ram"), 
          col_names = c("usens_cnc" = "Cancer",
                           "usens_god" = "God",
                           "usens_tbl" = "Tables",
                           "usens_okw" = "Onokawa (ghost)",
                           "usens_ram" = "Rambo"), 
          title = "Ecuadorian Amazon Version 2--Have you ever sensed __?", 
          data = df_usens)


#----------------------
## BOTH VERSIONS COMBINED BY QUESTION TYPE 
ec_usens_combined <- df_usens %>%
  filter(ont_ctry_name == "Ecuador") %>%
  select(usens_flu, usens_wen, usens_mug, usens_par, usens_spd,
         usens_cnc, usens_god, usens_tbl, usens_okw, usens_ram) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           usens_flu = "Scientific",
                           usens_par = "Scientific",
                           usens_cnc = "Scientific",
                           usens_mug = "Ordinary",
                           usens_tbl = "Ordinary",
                           usens_god = "Supernatural",
                           usens_wen = "Supernatural",
                           usens_okw = "Supernatural",
                           usens_spd = "Fictional",
                           usens_ram = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
ec_usens_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "Ecuadorian Amazon:Have you ever sensed __?--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

Peru

# Version 1 -- 21 participants
exist_bar(country = "Peru", version = 1, 
          cols = c("usens_ysh", "usens_par", "usens_god", "usens_tbl", "usens_njt", "usens_cha", "usens_cnc"), 
          col_names = c("usens_ysh" = "Mahua Yoshin\n(bad spirit)",  
                        "usens_par" = "Intestinal Parasites",  
                        "usens_god" = "God",  
                        "usens_tbl" = "Tables",  
                        "usens_njt" = "Ninja Turtles",  
                        "usens_cha" = "Chaikoni\n(invisible magic humans)",  
                        "usens_cnc" = "Cancer"), 
          title = "Peruvian Amazon Version 1--Have you ever sensed __?", 
          data = df_usens)



# Version 2 -- 19 participants
exist_bar(country = "Peru", version = 2, 
          cols = c("usens_grm", "usens_ron", "usens_taz", "usens_oni", "usens_smn", "usens_dlp"), 
          col_names = c("usens_grm" = "Germs", 
                           "usens_ron" = "Ronin\n(Anaconda)",
                           "usens_taz" = "Coffee Mug",
                           "usens_oni" = "Oni Ibo\n(good spirit)",
                           "usens_smn" = "Superman",
                           "usens_dlp" = "Joshin Kokoshka\n(pink river dolphin)"), 
          title = "Peruvian Amazon Version 2--Have you ever sensed __?", 
          data = df_usens)



#----------------------
# BOTH VERSIONS COMBINED

peru_usens_combined <- df_usens %>%
  filter(ont_ctry_name == "Peru") %>%
  select(usens_ysh, usens_par, usens_god, usens_tbl, usens_njt, usens_cha, usens_cnc,
         usens_grm, usens_ron, usens_taz, usens_oni, usens_smn, usens_dlp) %>%
  mutate(across(everything(), as.numeric)) %>%
  pivot_longer(everything(), names_to = "question", values_to = "response") %>%
  mutate(
    question_type = recode(question,
                           usens_par = "Scientific",
                           usens_cnc = "Scientific",
                           usens_grm = "Scientific",
                           usens_taz = "Ordinary",
                           usens_tbl = "Ordinary",
                           usens_ysh = "Supernatural",
                           usens_god = "Supernatural",
                           usens_cha = "Supernatural",
                           usens_ron = "Supernatural",
                           usens_oni = "Supernatural", 
                           usens_dlp = "Supernatural",
                           usens_njt = "Fictional",
                           usens_smn = "Fictional")
  ) %>%
  filter(!is.na(response)) %>%
  group_by(question_type) %>%
  summarise(
    yes_count = sum(response == 1),
    total_count = n(),
    proportion_yes = yes_count / total_count
  ) %>%
  arrange(desc(proportion_yes))  # Order by proportion

# Create bar plot
peru_usens_combined %>%
  ggplot(aes(x = reorder(question_type, -proportion_yes), y = proportion_yes, fill = question_type)) +
  geom_col(width = 0.8) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  theme_bw() +
  theme(legend.position = "none") +  # Removes the legend
  geom_text(aes(label = scales::percent(proportion_yes, accuracy = 1)),  # Add text on the bars
            position = position_stack(vjust = 0.5), color = "white", size = 5) +  # Adjust text appearance
  labs(
    title = "Ecuadorian Amazon:Have you ever sensed __?--Proportion of 'Yes' Responses by Question Type",
    x = "Question Type",
    y = "Proportion of 'Yes' Responses")

LS0tCnRpdGxlOiAiT250b2xvZ3lfZm9ycHViIgphdXRob3I6ICJFbGVhbm9yIFNjaGlsbGUtSHVkc29uIgpkYXRlOiAiMjAyNS0wNy0zMCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKIyBTZXQgdXAgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89Riwgd2FybmluZz1GLCBjYWNoZT1GLCBtZXNzYWdlPUYpCmBgYAoKYGBge3J9CiNsb2FkaW5nIHBhY2thZ2VzCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShmb3JjYXRzKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHB1cnJyKQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobG1lclRlc3QpCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShndHN1bW1hcnkpCgpsZXZlbHNfdHlwZSA8LSBjKCJPcmRpbmFyeSIsICJTY2llbnRpZmljIiwgIlN1cGVybmF0dXJhbCIsICJGaWN0aW9uYWwiKQpsZXZlbHNfY291bnRyeSA8LSBjKCJVUyIsICJHaGFuYSIsICJFY3VhZG9yIiwgIlBlcnUiKQpgYGAKCmBgYHtyfQojbG9hZGluZyBkYXRhIApkZl9yYXcgPC0gcmVhZF9leGNlbChwYXRoID0gIm9udG9sb2d5X2RhdGEueGxzeCIpCmBgYAoKYGBge3J9CiNtYWtpbmcgc29tZSBtb2RpZmljYXRpb25zCgpkZiA8LSBkZl9yYXcgJT4lCiAgbXV0YXRlKG9udF9jdHJ5X25hbWUgPSBjYXNlX3doZW4oCiAgICBvbnRfY3RyeSA9PSAxIH4gIlVTIiwKICAgIG9udF9jdHJ5ID09IDQgfiAiR2hhbmEiLAogICAgb250X2N0cnkgPT0gNyB+ICJQZXJ1IiwKICAgIG9udF9jdHJ5ID09IDYgfiAiRWN1YWRvciIsCiAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyAKICApKSAlPiUKICByZWxvY2F0ZShvbnRfY3RyeV9uYW1lLCAuYmVmb3JlID0gZXZlcnl0aGluZygpKQoKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiNjbGVhbmx5IGxvYWRpbmcgaW4gYWxsIGN1c3RvbSBmdW5jdGlvbnMgdG8gbm90IGNsdXR0ZXIgdXAgdGhpcyBybWQgZmlsZSAKc291cmNlKCIuL2N1c3RvbV9mdW5jdGlvbnMuUiIpCmBgYAoKIyMgRGF0YSBXcmFuZ2xpbmcKCmBgYHtyfQojZGZfc2VucyByZXF1aXJlcyBzZW5zb3J5X3ZhcnMsIHdoaWNoIGlzIGNyZWF0ZWQgaW4gdGhlIGN1c3RvbV9mdW5jdGlvbnMuUiBmaWxlCgojIENvbWJpbmUgaW50byBvbmUgYmlnIGRmX3NlbnMKZGZfc2VucyA8LSByZWR1Y2Uoc2Vuc29yeV92YXJzLCBsZWZ0X2pvaW4sIGJ5ID0gIm9udF9zdWJqIikKCiMgUmVqb2luIG1ldGFkYXRhCmRmX3NlbnMgPC0gZGYgJT4lCiAgc2VsZWN0KG9udF9zdWJqLCBvbnRfY3RyeV9uYW1lLCBvbnRfdmVyc2lvbikgJT4lCiAgbGVmdF9qb2luKGRmX3NlbnMsIGJ5ID0gIm9udF9zdWJqIikKCiMgZGZfdXNlbnMgcmVxdWlyZXMgdXNlbnNfdmFycywgd2hpY2ggaXMgY3JlYXRlZCBpbiB0aGUgY3VzdG9tX2Z1bmN0aW9ucy5SIGZpbGUKCiMgQ29tYmluZSBpbnRvIG9uZSBiaWcgZGZfc2VucwpkZl91c2VucyA8LSByZWR1Y2UodXNlbnNfdmFycywgbGVmdF9qb2luLCBieSA9ICJvbnRfc3ViaiIpCgojIFJlam9pbiBtZXRhZGF0YQpkZl91c2VucyA8LSBkZiAlPiUKICBzZWxlY3Qob250X3N1YmosIG9udF9jdHJ5X25hbWUsIG9udF92ZXJzaW9uKSAlPiUKICBsZWZ0X2pvaW4oZGZfdXNlbnMsIGJ5ID0gIm9udF9zdWJqIikKYGBgCgpgYGB7cn0KIyBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgZGF0YSBmcmFtZSBpbiB3aGljaCBtYW55IGltcG9ydGFudCB2YXJpYWJsZXMgYXJlIGNhbGN1bGF0ZWQsIGluY2x1ZGluZyB0aGUgY29uc2Vuc3VzIHNjb3JlIApkZl9leHRfbG9uZyA8LSBkZiAlPiUgCiAgZmlsdGVyKG9udF9jdHJ5X25hbWUgJWluJSBjKCJVUyIsICJHaGFuYSIsICJFY3VhZG9yIiwgIlBlcnUiKSkgJT4lCiAgc2VsZWN0KG9udF9jdHJ5X25hbWUsIG9udF9zdWJqLAogICAgICAgICBzY2lfZXh0X2dybSwgc3BuX2V4dF9kZW0sIG9yZF9leHRfbXVnLCBzY2lfZXh0X2ZyYywgZmljX2V4dF9zbW4sCiAgICAgICAgIHNjaV9leHRfY25jLCBzcG5fZXh0X2dvZCwgb3JkX2V4dF90YmwsIHNwbl9leHRfYWJzLCBmaWNfZXh0X2t3aywKICAgICAgICAgc2NpX2V4dF9mbHUsIHNwbl9leHRfd2VuLCBzY2lfZXh0X3BhciwgZmljX2V4dF9zcGQsIHNwbl9leHRfb2t3LCBmaWNfZXh0X3JhbSwgCiAgICAgICAgIHNwbl9leHRfeXNoLCBmaWNfZXh0X25qdCwgc3BuX2V4dF9jaGEsIG5hc19leHRfcm9uLCBvcmRfZXh0X3Rheiwgc3BuX2V4dF9vbmksIG5hc19leHRfZGxwCiAgICAgICAgICkgJT4lCiAgbXV0YXRlKGFjcm9zcyhjKC1vbnRfY3RyeV9uYW1lLCAtb250X3N1YmopLCBhcy5udW1lcmljKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGMoLW9udF9jdHJ5X25hbWUsIC1vbnRfc3ViaiksIG5hbWVzX3RvID0gInF1ZXN0aW9uIiwgdmFsdWVzX3RvID0gInJlc3BvbnNlIikgJT4lCiAgbXV0YXRlKAogICAgcmVzcG9uc2UgPSBpZmVsc2UocmVzcG9uc2UgPT0gOTksIDAuNSwgcmVzcG9uc2UpLAogICAgcXVlc3Rpb25fdHlwZSA9IHJlY29kZShxdWVzdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2V4dF9ncm0gPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9leHRfZnJjID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfZXh0X2NuYyA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2V4dF9mbHUgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9leHRfcGFyID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRfZXh0X211ZyA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZF9leHRfdGJsID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkX2V4dF90YXogPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fZXh0X2dvZCA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fZXh0X2RlbSA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fZXh0X3dlbiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fZXh0X29rdyA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fZXh0X2FicyA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fZXh0X3lzaCA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fZXh0X2NoYSA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYXNfZXh0X3JvbiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fZXh0X29uaSA9ICJTdXBlcm5hdHVyYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFzX2V4dF9kbHAgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9rd2sgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9zbW4gPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9zcGQgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9yYW0gPSAiRmljdGlvbmFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19leHRfbmp0ID0gIkZpY3Rpb25hbCIpLCAKICAgIAogICkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZXNwb25zZSkpICU+JSAKICBncm91cF9ieShvbnRfY3RyeV9uYW1lLCBxdWVzdGlvbikgJT4lCiAgbXV0YXRlKGNvbnNlbnN1c19leGNsX3NlbGYgPSAoc3VtKHJlc3BvbnNlLCBuYS5ybSA9IFRSVUUpIC0gcmVzcG9uc2UpLyhuKCktMSksCiAgICAgICAgIGNvbnNlbnN1cyA9IChzdW0ocmVzcG9uc2UsIG5hLnJtID0gVFJVRSkvbigpKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKGl0ZW1fY29kZSA9IHN0cl9leHRyYWN0KHF1ZXN0aW9uLCAiW15fXSskIikpICNleHRyYWN0aW5nIGZpbmFsIDMgY2hhcmFjdGVycwoKIyBtYWtpbmcgbG9uZyB1c2VucyBkZiAKZGZfdXNlbnNfbG9uZyA8LSBkZl91c2VucyAlPiUgCiAgc2VsZWN0KC1vbnRfdmVyc2lvbikgJT4lIAogIHBpdm90X2xvbmdlcihjKC1vbnRfY3RyeV9uYW1lLCAtb250X3N1YmopLCBuYW1lc190byA9ICJ1c2Vuc19xdWVzdGlvbiIsIHZhbHVlc190byA9ICJ1c2Vuc19yZXNwb25zZSIpICU+JQogIGZpbHRlcighaXMubmEodXNlbnNfcmVzcG9uc2UpKSAlPiUgCiAgbXV0YXRlKGl0ZW1fY29kZSA9IHN0cl9leHRyYWN0KHVzZW5zX3F1ZXN0aW9uLCAiW15fXSskIikpICNleHRyYWN0aW5nIGZpbmFsIDMgY2hhcmFjdGVycwoKIyBtYWtpbmcgbG9uZyBjb25maWRlbmNlIGRmCmRmX2NvbmZfbG9uZyA8LSBkZiAlPiUgCiAgZmlsdGVyKG9udF9jdHJ5X25hbWUgJWluJSBjKCJVUyIsICJHaGFuYSIsICJFY3VhZG9yIiwgIlBlcnUiKSkgJT4lICAKICAgIHNlbGVjdChvbnRfY3RyeV9uYW1lLCBvbnRfc3ViaiwKICAgICAgICAgICBzY2lfY29uZi5leHRfZ3JtLCBzcG5fY29uZi5leHRfZGVtLCBvcmRfY29uZi5leHRfbXVnLCBzY2lfY29uZi5leHRfZ3Z0LCBmaWNfY29uZi5leHRfc21uLAogICAgICAgICAgIHNjaV9jb25mLmV4dF9jbmMsIHNwbl9jb25mLmV4dF9nb2QsIG9yZF9jb25mLmV4dF90YmwsIHNwbl9jb25mLmV4dF9naHMsIGZpY19jb25mLmV4dF9oYXAsICAKICAgICAgICAgICBzY2lfY29uZi5leHRfZ3JtLCBzcG5fY29uZi5leHRfZGVtLCBvcmRfY29uZi5leHRfbXVnLCBzY2lfY29uZi5leHRfZnJjLCBmaWNfY29uZi5leHRfc21uLCAgCiAgICAgICAgICAgc2NpX2NvbmYuZXh0X2NuYywgc3BuX2NvbmYuZXh0X2dvZCwgb3JkX2NvbmYuZXh0X3RibCwgc3BuX2NvbmYuZXh0X2FicywgZmljX2NvbmYuZXh0X2t3aywgIAogICAgICAgICAgIHNjaV9jb25mLmV4dF9mbHUsIHNwbl9jb25mLmV4dF93ZW4sIG9yZF9jb25mLmV4dF9tdWcsIHNjaV9jb25mLmV4dF9wYXIsIGZpY19jb25mLmV4dF9zcGQsICAKICAgICAgICAgICBzY2lfY29uZi5leHRfY25jLCBzcG5fY29uZi5leHRfZ29kLCBvcmRfY29uZi5leHRfdGJsLCBzcG5fY29uZi5leHRfb2t3LCBmaWNfY29uZi5leHRfcmFtLCAgCiAgICAgICAgICAgc3BuX2NvbmYuZXh0X3lzaCwgc2NpX2NvbmYuZXh0X3Bhciwgc3BuX2NvbmYuZXh0X2dvZCwgb3JkX2NvbmYuZXh0X3RibCwgIAogICAgICAgICAgIGZpY19jb25mLmV4dF9uanQsIHNwbl9jb25mLmV4dF9jaGEsIHNjaV9jb25mLmV4dF9jbmMsICAKICAgICAgICAgICBzY2lfY29uZi5leHRfZ3JtLCBuYXNfY29uZi5leHRfcm9uLCBvcmRfY29uZi5leHRfdGF6LCBzcG5fY29uZi5leHRfb25pLCAgCiAgICAgICAgICAgZmljX2NvbmYuZXh0X3NtbiwgbmFzX2NvbmYuZXh0X2RscCkgJT4lICAKICAgIG11dGF0ZShhY3Jvc3MoLW9udF9jdHJ5X25hbWUsIGFzLm51bWVyaWMpKSAlPiUKICAgIHBpdm90X2xvbmdlcihjKC1vbnRfY3RyeV9uYW1lLCAtb250X3N1YmopLCBuYW1lc190byA9ICJjb25mX3F1ZXN0aW9uIiwgdmFsdWVzX3RvID0gImNvbmZfcmVzcG9uc2UiKSAlPiUgIAogICAgZmlsdGVyKCFpcy5uYShjb25mX3Jlc3BvbnNlKSkgJT4lICAKICAgIG11dGF0ZShjYXRlZ29yeSA9IHJlY29kZShjb25mX3F1ZXN0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfY29uZi5leHRfZ3JtID0gIlNjaWVudGlmaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfY29uZi5leHRfZnJjID0gIlNjaWVudGlmaWMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2NvbmYuZXh0X2NuYyA9ICJTY2llbnRpZmljIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9jb25mLmV4dF9mbHUgPSAiU2NpZW50aWZpYyIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfY29uZi5leHRfcGFyID0gIlNjaWVudGlmaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfY29uZi5leHRfZ3Z0ID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZF9jb25mLmV4dF9tdWcgPSAiT3JkaW5hcnkiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkX2NvbmYuZXh0X3RibCA9ICJPcmRpbmFyeSIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRfY29uZi5leHRfdGF6ID0gIk9yZGluYXJ5IiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbl9jb25mLmV4dF9nb2QgPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbl9jb25mLmV4dF9kZW0gPSAiU3VwZXJuYXR1cmFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbmYuZXh0X3dlbiA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbmYuZXh0X29rdyA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbmYuZXh0X2FicyA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbmYuZXh0X3lzaCA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbmYuZXh0X2NoYSA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFzX2NvbmYuZXh0X3JvbiA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbmYuZXh0X29uaSA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFzX2NvbmYuZXh0X2RscCA9ICJTdXBlcm5hdHVyYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fY29uZi5leHRfZ2hzID0gIlN1cGVybmF0dXJhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19jb25mLmV4dF9rd2sgPSAiRmljdGlvbmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19jb25mLmV4dF9zbW4gPSAiRmljdGlvbmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19jb25mLmV4dF9zcGQgPSAiRmljdGlvbmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19jb25mLmV4dF9yYW0gPSAiRmljdGlvbmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19jb25mLmV4dF9uanQgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWNfY29uZi5leHRfaGFwID0gIkZpY3Rpb25hbCIpLAogICAgICAgICAgIG9udF9jdHJ5X25hbWUgPSBmYWN0b3Iob250X2N0cnlfbmFtZSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpLAogICAgICAgICAgIHJlc3BvbnNlX3R4dCA9IHJlY29kZShjb25mX3Jlc3BvbnNlLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAwYCA9ICJOb3Qgc3VyZSIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gIlNvbWV3aGF0IHN1cmUiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICJQcmV0dHkgc3VyZSIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gIlZlcnkgc3VyZSIpKSAlPiUgCiAgbXV0YXRlKGl0ZW1fY29kZSA9IHN0cl9leHRyYWN0KGNvbmZfcXVlc3Rpb24sICJbXl9dKyQiKSkgI2V4dHJhY3RpbmcgZmluYWwgMyBjaGFyYWN0ZXJzCmBgYAoKYGBge3J9CiMgam9pbmluZyBpbnRvIG9uZSBkYXRhZnJhbWUKZGZfZXh0X3VzZW5zX2NvbmYgPC0gbGVmdF9qb2luKAogIGRmX2V4dF9sb25nLCBkZl91c2Vuc19sb25nLCBieSA9IGMoIm9udF9jdHJ5X25hbWUiLCAib250X3N1YmoiLCAiaXRlbV9jb2RlIikKKSAlPiUgCiAgbGVmdF9qb2luKGRmX2NvbmZfbG9uZywgYnkgPSBjKCJvbnRfY3RyeV9uYW1lIiwgIm9udF9zdWJqIiwgIml0ZW1fY29kZSIpKSAlPiUKICBtdXRhdGUoaXRlbV9jb2RlID0gYXMuZmFjdG9yKGl0ZW1fY29kZSksIAogICAgICAgICBxdWVzdGlvbl90eXBlID0gZmFjdG9yKHF1ZXN0aW9uX3R5cGUsIGxldmVscyA9IGxldmVsc190eXBlKSwgCiAgICAgICAgIG9udF9jdHJ5X25hbWUgPSBmYWN0b3Iob250X2N0cnlfbmFtZSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAjbWFraW5nIHRoaXMgYSBmYWN0b3Igc28gd2UgY2FuIGRvIG9yZGluYWwgcmVncmVzc2lvbgpgYGAKCiMgUGFydGljaXBhbnQgRGVtb2dyYXBoaWNzIAoKYGBge3J9CiMgSG93IG1hbnkgcGFydGljaXBhbnRzIHBlciBjb3VudHJ5PyAKeHRhYnMofiBvbnRfY3RyeV9uYW1lLCBkYXRhID0gZGYpCgojIFZlcnNpb24gb2YgcXVlc3Rpb25zICh2ZXJzaW9uIDEgb3IgdmVyc2lvbiAyKSBieSBjb3VudHJ5IAp4dGFicyh+IG9udF9jdHJ5X25hbWUgKyBvbnRfdmVyc2lvbiwgZGF0YSA9IGRmKQpgYGAKCmBgYHtyfQojYWdlCmRmICU+JSAKICBtdXRhdGUob250X2FnZSA9IGFzLm51bWVyaWMob250X2FnZSkpICU+JQogIGdyb3VwX2J5KG9udF9jdHJ5X25hbWUpICU+JSAKICBzdW1tYXJpemUobiA9IG4oKSwKICAgICAgICAgICAgbWVhbl9hZ2UgPSBtZWFuKG9udF9hZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgIG1lZF9hZ2UgPSBtZWRpYW4ob250X2FnZSwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIHNkX2FnZSA9IHNkKG9udF9hZ2UsIG5hLnJtID0gVCksIAogICAgICAgICAgICByYW5nZV9hZ2UgPSBwYXN0ZTAobWluKG9udF9hZ2UsIG5hLnJtID0gVCksICIgLSAiLCBtYXgob250X2FnZSwgbmEucm0gPSBUKSkpIAoKI3NleCBtYWxlID0gMQp4dGFicyh+IG9udF9jdHJ5X25hbWUgKyBvbnRfc2V4LCBkYXRhID0gZGYpCgojZXRobmljaXR5IAp4dGFicyh+IHRvbG93ZXIob250X2V0aG4pICsgb250X2N0cnlfbmFtZSwgZGF0YSA9IGRmKQoKI2VkdWNhdGlvbiAKeHRhYnMofiB0b2xvd2VyKG9udF9oaWVkKSArIG9udF9jdHJ5X25hbWUsIGRhdGEgPSBkZikKCiMiaW1wb3J0YW5jZSBvZiBnb2QgIkdvZCBwbGF5cyBhIHZlcnkgaW1wb3J0YW50IHJvbGUgaW4gbXkgbGlmZSAoc3Ryb25nbHkgZGlzYWdyZWUgdG8gc3Ryb25nbHkgYWdyZWUpCnh0YWJzKH4gb250X2N0cnlfbmFtZSArIGFzLm51bWVyaWMob250X2ltZ2QpLCBkYXRhID0gZGYpCgojY2h1cmNoIGF0dGVuZGFuY2UKeHRhYnMofiB0b2xvd2VyKG9udF9jaGZxKSArIG9udF9jdHJ5X25hbWUsIGRhdGEgPSBkZikKCiMgRG8geW91IHRoaW5rIHlvdSBhcmUgcmljaGVyIG9yIHBvb3JlciB0aGFuIG1vc3Qgb2YgdGhlIHBlb3BsZSBpbiB5b3VyIGNvbW11bml0eT8gKG11Y2ggcG9vcmVyIC0gbXVjaCByaWNoZXIpCnh0YWJzKH4gb250X2N0cnlfbmFtZSArIGFzLm51bWVyaWMob250X3NlcyksIGRhdGEgPSBkZikKCiMgRG8geW91IGZlZWwgeW91IGNhbiBhZmZvcmQgdG8gYnV5IHRoaW5ncyB5b3UgbmVlZCwgbGlrZSBjbG90aGluZyBhbmQgc2hvZXM/IChuby95ZXMpCnh0YWJzKH4gb250X2N0cnlfbmFtZSArIGFzLm51bWVyaWMob250X2FmZnIpLCBkYXRhID0gZGYpCmBgYAoKIyBGaWd1cmUgMSwgQWNjb21wYW55aW5nIEFuYWx5c2VzICYgQXBwZW5kaXggQyByZWdyZXNzaW9uIHJlc3VsdHMKClRoZSBnb2FsIGhlcmUgaXMgdG8gY29tYmluZSBjb25maWRlbmNlIGFuZCBleGlzdGVuY2Ugc2NvcmVzLiBUaGUgY29uZmlkZW5jZSBncmFwaCBhYm92ZSBzaG93cyBwZW9wbGUncyBjb25maWRlbmNlIHJhdGluZ3MgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgc2FpZCB0aGUgb2JqZWN0IGV4aXN0ZWQgb3Igbm90LiBTbywgSSB3aWxsIGNvbWJpbmUgdGhlbSB0aGlzIHdheToKLSBpZiB0aGV5IHNhaWQgaXQgZG9lc24ndCBleGlzdCAqLTEKLSBpZiB0aGV5IHNhaWQgaXQgZG9lcyBleGlzdCAqMQotIGlmIHRoZXkgc2FpZCB0aGV5IGRvbid0IGtub3cgKjAgCgpUaGlzIHdheSwgYSBwZXJzb24gd2hvIHNhaWQgdGhleSBkb24ndCBrbm93IGlmIGl0IGV4aXN0cyBhbmQgYSBwZXJzb24gd2hvIHNhaWQgaXQgZGlkIG9yIGRpZG4ndCBidXQgc2FpZCB0aGV5IHdlcmUgIm5vdCBzdXJlIiB3aWxsIGJvdGggZ2V0IGEgc2NvcmUgb2YgMC4gQSBwZXJzb24gd2hvIGlzICJ2ZXJ5IHN1cmUiIGl0IGRvZXNuJ3QgZXhpc3Qgd2lsbCBnZXQgYSBzY29yZSBvZiAtMyBhbmQgYSBwZXJzb24gd2hvIGlzICJ2ZXJ5IHN1cmUiIGl0IGRvZXMgZXhpc3Qgd2lsbCBnZXQgYSBzY29yZSBvZiAzLiAKCmBgYHtyfQojIG1ha2luZyBuZXcgY29sdW1uIG9mIGV4aXN0ZW5jZSByZXNwb25zZSBkaXJlY3Rpb25zCmRmX2V4dF91c2Vuc19jb25mIDwtIGRmX2V4dF91c2Vuc19jb25mICU+JSAKICBtdXRhdGUoZXh0X2RpciA9IGNhc2Vfd2hlbigKICAgIHJlc3BvbnNlID09IDEgfiAxLAogICAgcmVzcG9uc2UgPT0gMCB+IC0xLAogICAgcmVzcG9uc2UgPT0gMC41IH4gMCwKICAgIFRSVUUgfiByZXNwb25zZSksIAogICAgY29uZl9kaXIgPSBjb25mX3Jlc3BvbnNlKmV4dF9kaXIsIAogICAgY29uZl9kaXJfdGV4dCA9IGNhc2Vfd2hlbigKICAgICAgY29uZl9kaXIgPT0gLTMgfiAiVmVyeSBzdXJlIGRvZXNuJ3QgZXhpc3QiLAogICAgICBjb25mX2RpciA9PSAtMiB+ICJQcmV0dHkgc3VyZSBkb2Vzbid0IGV4aXN0IiwKICAgICAgY29uZl9kaXIgPT0gLTEgfiAiU29tZXdoYXQgc3VyZSBkb2Vzbid0IGV4aXN0IiwKICAgICAgY29uZl9kaXIgPT0gMCB+ICJOb3Qgc3VyZSIsCiAgICAgIGNvbmZfZGlyID09IDEgfiAiU29tZXdoYXQgc3VyZSBleGlzdHMiLAogICAgICBjb25mX2RpciA9PSAyIH4gIlByZXR0eSBzdXJlIGV4aXN0cyIsCiAgICAgIGNvbmZfZGlyID09IDMgfiAiVmVyeSBzdXJlIGV4aXN0cyIpLCAKICAgIGNvbmZfZGlyX3RleHQgPSBmYWN0b3IoY29uZl9kaXJfdGV4dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlZlcnkgc3VyZSBkb2Vzbid0IGV4aXN0IiwgIlByZXR0eSBzdXJlIGRvZXNuJ3QgZXhpc3QiLCAiU29tZXdoYXQgc3VyZSBkb2Vzbid0IGV4aXN0IiwgIk5vdCBzdXJlIiwgIlNvbWV3aGF0IHN1cmUgZXhpc3RzIiwgIlByZXR0eSBzdXJlIGV4aXN0cyIsICJWZXJ5IHN1cmUgZXhpc3RzIikpCiAgICApCmBgYAoKR3JhcGhpbmcgRmlndXJlIDEKCmBgYHtyLCBmaWcud2lkdGg9MTV9CmNvbmZfY29sb3JzIDwtIChSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoNywgIlJkWWxCdSIpKQoKIyBDcmVhdGUgc3RhY2tlZCBiYXIgcGxvdCAgCmRmX2V4dF91c2Vuc19jb25mICU+JSAKICBmaWx0ZXIoIWlzLm5hKGNvbmZfZGlyX3RleHQpKSAlPiUgCiAgbXV0YXRlKGNhdGVnb3J5ID0gZmFjdG9yKGNhdGVnb3J5LCBsZXZlbHMgPSBjKCJPcmRpbmFyeSIsICJTY2llbnRpZmljIiwgIlN1cGVybmF0dXJhbCIsICJGaWN0aW9uYWwiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IGNhdGVnb3J5LCBmaWxsID0gY29uZl9kaXJfdGV4dCkpICsgIAogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArICAjIFN0YWNrZWQgcHJvcG9ydGlvbnMKICAjIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChjb3VudCkpLAogICMgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZmlsbCh2anVzdCA9IDAuNSksCiAgIyAgICAgICAgICAgc2l6ZSA9IDYsIGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29uZl9jb2xvcnMsIGRyb3AgPSBGQUxTRSkgKyAKICB0aGVtZV9idygpICsgIAogIGxhYnMoCiAgICB4ID0gIkNhdGVnb3J5IG9mIEl0ZW1zIiwgIAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIFJlc3BvbnNlcyIsICAKICAgIGZpbGwgPSAiQ29uZmlkZW5jZSB4IEV4aXN0ZW5jZSIsICAKICAgIHRpdGxlID0gIkNvbmZpZGVuY2UgeCBFeGlzdGVuY2UgYnkgQ2F0ZWdvcnkgYW5kIEZpZWxkIFNpdGUiCiAgKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBhbmdsZSA9IC0zNSwgdmp1c3QgPSAxLCBoanVzdCA9IDApLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjUpLCAKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwgCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPTE4KSkgKwogIGZhY2V0X3dyYXAofiBvbnRfY3RyeV9uYW1lLCBuY29sID0gNCkgICAjIFNlcGFyYXRlIHBsb3RzIGZvciBlYWNoIGNvdW50cnkKYGBgCgoKTW9kZWxzIHByZWRpY3RpbmcgY29uZmlkZW5jZSB4IGV4aXN0ZW5jZSBzY29yZXMgYnkgY2F0ZWdvcnkgd2l0aCBzZXBhcmF0ZSByZWdyZXNzaW9ucyBmb3IgZWFjaCBjb3VudHJ5LiBUaGUgcGFpcndpc2UgY29udHJhc3RzIGhlcmUgc2hvd2luZyBvcmRpbmFyeSB2cy4gc3VwZXJuYXR1cmFsIGFuZCBzY2llbnRpZmljIHZzLiBzdXBlcm5hdHVyYWwgYXJlIHdoYXQgbWFrZSB1cCBUYWJsZSAyLiBGdWxsIHJlc3VsdHMgYXJlIHJlcG9ydGVkIGluIEFwcGVuZGl4IEMuIAoKYGBge3J9CiMgMSByZWdyZXNzaW9uIHBlciBjb3VudHJ5ICg0IHRvdGFsKSB3aGVyZSByZXNwb25zZSBpcyBwcmVkaWN0ZWQgYnkgY2F0ZWdvcnkKCiMgVVMKbS51cyA8LSBsbWVyKGNvbmZfZGlyIH4gcXVlc3Rpb25fdHlwZSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGZpbHRlcihkZl9leHRfdXNlbnNfY29uZiwgb250X2N0cnlfbmFtZSA9PSAiVVMiKSkKc3VtbWFyeShtLnVzKQoKIyNwYWlyd2lzZSBjb250cmFzdHMKZW1tLnVzIDwtIGVtbWVhbnMobS51cywgfiBxdWVzdGlvbl90eXBlKQpjb250cmFzdChlbW0udXMsIG1ldGhvZCA9ICJwYWlyd2lzZSIsIGFkanVzdCA9ICJub25lIikKCiMgR2hhbmEKbS5naGFuYSA8LSBsbWVyKGNvbmZfZGlyIH4gcXVlc3Rpb25fdHlwZSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGZpbHRlcihkZl9leHRfdXNlbnNfY29uZiwgb250X2N0cnlfbmFtZSA9PSAiR2hhbmEiKSkKc3VtbWFyeShtLmdoYW5hKQoKIyNwYWlyd2lzZSBjb250cmFzdHMKZW1tLmdoYW5hIDwtIGVtbWVhbnMobS5naGFuYSwgfiBxdWVzdGlvbl90eXBlKQpjb250cmFzdChlbW0uZ2hhbmEsIG1ldGhvZCA9ICJwYWlyd2lzZSIsIGFkanVzdCA9ICJub25lIikKCiMgRWN1YWRvcgptLmVjdWFkb3IgPC0gbG1lcihjb25mX2RpciB+IHF1ZXN0aW9uX3R5cGUgKyAoMXxvbnRfc3ViaiksIGRhdGEgPSBmaWx0ZXIoZGZfZXh0X3VzZW5zX2NvbmYsIG9udF9jdHJ5X25hbWUgPT0gIkVjdWFkb3IiKSkKc3VtbWFyeShtLmVjdWFkb3IpCgojI3BhaXJ3aXNlIGNvbnRyYXN0cwplbW0uZWN1YWRvciA8LSBlbW1lYW5zKG0uZWN1YWRvciwgfiBxdWVzdGlvbl90eXBlKQpjb250cmFzdChlbW0uZWN1YWRvciwgbWV0aG9kID0gInBhaXJ3aXNlIiwgYWRqdXN0ID0gIm5vbmUiKQoKIyBQZXJ1Cm0ucGVydSA8LSBsbWVyKGNvbmZfZGlyIH4gcXVlc3Rpb25fdHlwZSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGZpbHRlcihkZl9leHRfdXNlbnNfY29uZiwgb250X2N0cnlfbmFtZSA9PSAiUGVydSIpKQpzdW1tYXJ5KG0ucGVydSkKCiMjcGFpcndpc2UgY29udHJhc3RzCmVtbS5wZXJ1IDwtIGVtbWVhbnMobS5wZXJ1LCB+IHF1ZXN0aW9uX3R5cGUpCmNvbnRyYXN0KGVtbS5wZXJ1LCBtZXRob2QgPSAicGFpcndpc2UiLCBhZGp1c3QgPSAibm9uZSIpCgpgYGAKCk1vZGVsIHByZWRpY3RpbmcgY29uZmlkZW5jZSB4IGV4aXN0ZW5jZSBzY29yZXMgYnkgY2F0ZWdvcnkgcG9vbGluZyBhY3Jvc3Mgbm9uLVVTIGNvdW50cmllcy4gVGhlc2UgcmVzdWx0cyBzaG93IHRoYXQgd2hlbiB5b3UgY29tYmluZSBhbGwgbm9uLVVTIGNvdW50cnkgcmVzcG9uc2VzIHRvZ2V0aGVyLCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yZGluYXJ5IGFuZCBzdXBlcm5hdHVyYWwgY29uZmlkZW5jZSByYXRpbmdzIGFyZSBzaWduaWZpY2FudC4gCgpgYGB7cn0KI2NvbWJpbmdpbmcgbm9uIHVzIGNvdW50cmllcwptLm5vbi51cyA8LSBsbWVyKGNvbmZfZGlyIH4gcXVlc3Rpb25fdHlwZSArICgxfG9udF9jdHJ5X25hbWUvb250X3N1YmopLCBkYXRhID0gZmlsdGVyKGRmX2V4dF91c2Vuc19jb25mLCBvbnRfY3RyeV9uYW1lICE9ICJVUyIpKQpzdW1tYXJ5KG0ubm9uLnVzKQoKIyNwYWlyd2lzZSBjb250cmFzdHMKZW1tLm5vbi51cyA8LSBlbW1lYW5zKG0ubm9uLnVzLCB+IHF1ZXN0aW9uX3R5cGUpCmNvbnRyYXN0KGVtbS5ub24udXMsIG1ldGhvZCA9ICJwYWlyd2lzZSIsIGFkanVzdCA9ICJub25lIikKYGBgCgpNb2RlbCBwcmVkaWN0aW5nIGNvbmZpZGVuY2UgeCBleGlzdGVuY2Ugc2NvcmVzIGJ5IGNhdGVnb3J5LCBidXQgb25seSBmb3IgaGlnaGVzdCBjb250cmFzdCBvcmRpbmFyeSB2cy4gc3VwZXJuYXR1cmFsIGl0ZW1zIChjb2ZmZWUgY3VwcyAmIHRhYmxlcyB2cy4gR29kICYgZGVtb25zKS4gVGhlc2UgcmVzdWx0cyBzaG93IHRoYXQgdGhlc2UgaGlnaGVzdCBjb250cmFzdHMgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGluIHRoZSBVUyBhbmQgR2hhbmEsIGJ1dCBub3QgaW4gRWN1YWRvciBhbmQgUGVydSAoaW4gRWN1YWRvciwgb3VyIHNtYWxsZXN0IHNhbXBsZSBzaXplLCB0aGVyZSBhcmUgaGludHMgdGhhdCB0aGlzIGVmZmVjdCBtaWdodCBiZSBmb3VuZCBpbiBmdXR1cmUgc2ltaWxhciBzdHVkaWVzKS4gU2VlIEFwcGVuZGl4IEEgZm9yIGZ1bGwgY29uZmlkZW5jZSBhbmQgZXhpc3RlbmNlIHJhdGluZ3MgYnJva2VuIGRvd24gYnkgaXRlbSwgdmVyc2lvbiwgYW5kIGNvdW50cnkuIAoKYGBge3J9CiMgVVMgLS1tdWdzLCB0YWJsZXMsIGdvZCwgZGVtb25zCm0ubXVnLnVzIDwtIGxtZXIoY29uZl9kaXIgfiBxdWVzdGlvbl90eXBlICsgKDF8b250X3N1YmopLCBkYXRhID0gZGZfZXh0X3VzZW5zX2NvbmYgJT4lIAogICAgICAgICAgICAgICBmaWx0ZXIob250X2N0cnlfbmFtZSA9PSAiVVMiLAogICAgICAgICAgICAgICAgICAgICAgaXRlbV9jb2RlICVpbiUgYygibXVnIiwgInRibCIsICJkZW0iLCAiZ29kIikpKQpzdW1tYXJ5KG0ubXVnLnVzKQoKIyBHaGFuYSAtLW11Z3MsIHRhYmxlcywgZ29kLCBkZW1vbnMKbS5tdWcuZ2hhbmEgPC0gbG1lcihjb25mX2RpciB+IHF1ZXN0aW9uX3R5cGUgKyAoMXxvbnRfc3ViaiksIGRhdGEgPSBkZl9leHRfdXNlbnNfY29uZiAlPiUgCiAgICAgICAgICAgICAgIGZpbHRlcihvbnRfY3RyeV9uYW1lID09ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICBpdGVtX2NvZGUgJWluJSBjKCJtdWciLCAidGJsIiwgImRlbSIsICJnb2QiKSkpCnN1bW1hcnkobS5tdWcuZ2hhbmEpCgojIEVjdWFkb3IgLS1tdWdzLCB0YWJsZXMsIGdvZCwgV2VuZQptLm11Zy5lY3VhZG9yIDwtIGxtZXIoY29uZl9kaXIgfiBxdWVzdGlvbl90eXBlICsgKDF8b250X3N1YmopLCBkYXRhID0gZGZfZXh0X3VzZW5zX2NvbmYgJT4lIAogICAgICAgICAgICAgICBmaWx0ZXIob250X2N0cnlfbmFtZSA9PSAiRWN1YWRvciIsCiAgICAgICAgICAgICAgICAgICAgICBpdGVtX2NvZGUgJWluJSBjKCJtdWciLCAidGJsIiwgIndlbiIsICJnb2QiKSkpICNXZW5lIGluc3RlYWQgb2YgZGVtb24Kc3VtbWFyeShtLm11Zy5lY3VhZG9yKQoKIyBQZXJ1IC0tbXVncywgdGFibGVzLCBnb2QsIE9uaSBJYm8gCm0ubXVnLnBlcnUgPC0gbG1lcihjb25mX2RpciB+IHF1ZXN0aW9uX3R5cGUgKyAoMXxvbnRfc3ViaiksIGRhdGEgPSBkZl9leHRfdXNlbnNfY29uZiAlPiUgCiAgICAgICAgICAgICAgIGZpbHRlcihvbnRfY3RyeV9uYW1lID09ICJQZXJ1IiwKICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fY29kZSAlaW4lIGMoInRheiIsICJ0YmwiLCAib25pIiwgImdvZCIpKSkKc3VtbWFyeShtLm11Zy5wZXJ1KQpgYGAKCiMgRmlndXJlIDIgJiBBY2NvbXBhbnlpbmcgQW5hbHlzZXMKCmBgYHtyLCBmaWcud2lkdGg9MTV9CmRhdGFfbG9uZ19jb21tIDwtIGRmICU+JQogIGZpbHRlcihvbnRfY3RyeV9uYW1lICVpbiUgYygiVVMiLCAiR2hhbmEiLCAiRWN1YWRvciIsICJQZXJ1IikpICU+JSAgCiAgICBzZWxlY3Qob250X2N0cnlfbmFtZSwgb250X3N1YmosCiAgICAgICAgICAgc2NpX2NvbXVfZ3JtLCBzcG5fY29tdV9kZW0sIG9yZF9jb211X211Zywgc2NpX2NvbXVfZ3Z0LCBmaWNfY29tdV9zbW4sCiAgICAgICAgICAgc2NpX2NvbXVfY25jLCBzcG5fY29tdV9nb2QsIG9yZF9jb211X3RibCwgc3BuX2NvbXVfZ2hzLCBmaWNfY29tdV9oYXAsICAKICAgICAgICAgICBzY2lfY29tdV9ncm0sIHNwbl9jb211X2RlbSwgb3JkX2NvbXVfbXVnLCBzY2lfY29tdV9mcmMsIGZpY19jb211X3NtbiwgIAogICAgICAgICAgIHNjaV9jb211X2NuYywgc3BuX2NvbXVfZ29kLCBvcmRfY29tdV90YmwsIHNwbl9jb211X2FicywgZmljX2NvbXVfa3drLCAgCiAgICAgICAgICAgc2NpX2NvbXVfZmx1LCBzcG5fY29tdV93ZW4sIG9yZF9jb211X211Zywgc2NpX2NvbXVfcGFyLCBmaWNfY29tdV9zcGQsICAKICAgICAgICAgICBzY2lfY29tdV9jbmMsIHNwbl9jb211X2dvZCwgb3JkX2NvbXVfdGJsLCBzcG5fY29tdV9va3csIGZpY19jb211X3JhbSwgIAogICAgICAgICAgIHNwbl9jb211X3lzaCwgc2NpX2NvbXVfcGFyLCBzcG5fY29tdV9nb2QsIG9yZF9jb211X3RibCwgIAogICAgICAgICAgIGZpY19jb211X25qdCwgc3BuX2NvbXVfY2hhLCBzY2lfY29tdV9jbmMsICAKICAgICAgICAgICBzY2lfY29tdV9ncm0sIG5hc19jb211X3Jvbiwgb3JkX2NvbXVfdGF6LCBzcG5fY29tdV9vbmksICAKICAgICAgICAgICBmaWNfY29tdV9zbW4sIG5hc19jb211X2RscCkgJT4lICAKICAgIG11dGF0ZShhY3Jvc3MoYygtb250X2N0cnlfbmFtZSwgLW9udF9zdWJqKSwgYXMubnVtZXJpYykpICU+JQogICAgcGl2b3RfbG9uZ2VyKGMoLW9udF9jdHJ5X25hbWUsIC1vbnRfc3ViaiksIG5hbWVzX3RvID0gInF1ZXN0aW9uIiwgdmFsdWVzX3RvID0gInJlc3BvbnNlIikgJT4lICAKICAgIG11dGF0ZShyZXNwb25zZSA9IGlmZWxzZShyZXNwb25zZSA9PSA5OSwgMC41LCByZXNwb25zZSkpICU+JQogICAgZmlsdGVyKCFpcy5uYShyZXNwb25zZSkpICU+JSAgCiAgICBtdXRhdGUoY2F0ZWdvcnkgPSByZWNvZGUocXVlc3Rpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9jb211X2dybSA9ICJTY2llbnRpZmljIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2NvbXVfZnJjID0gIlNjaWVudGlmaWMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2NvbXVfY25jID0gIlNjaWVudGlmaWMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2NvbXVfZmx1ID0gIlNjaWVudGlmaWMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2NvbXVfcGFyID0gIlNjaWVudGlmaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfY29tdV9ndnQgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkX2NvbXVfbXVnID0gIk9yZGluYXJ5IiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZF9jb211X3RibCA9ICJPcmRpbmFyeSIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRfY29tdV90YXogPSAiT3JkaW5hcnkiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbXVfZ29kID0gIlN1cGVybmF0dXJhbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fY29tdV9kZW0gPSAiU3VwZXJuYXR1cmFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbXVfd2VuID0gIlN1cGVybmF0dXJhbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fY29tdV9va3cgPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbl9jb211X2FicyA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbXVfeXNoID0gIlN1cGVybmF0dXJhbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fY29tdV9jaGEgPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hc19jb211X3JvbiA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbXVfb25pID0gIlN1cGVybmF0dXJhbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXNfY29tdV9kbHAgPSAiU3VwZXJuYXR1cmFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2NvbXVfZ2hzID0gIlN1cGVybmF0dXJhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19jb211X2t3ayA9ICJGaWN0aW9uYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2NvbXVfc21uID0gIkZpY3Rpb25hbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWNfY29tdV9zcGQgPSAiRmljdGlvbmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19jb211X3JhbSA9ICJGaWN0aW9uYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2NvbXVfbmp0ID0gIkZpY3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2NvbXVfaGFwID0gIkZpY3Rpb25hbCIpLCAgCiAgICAgICAgICAgcmVzcG9uc2VfdHh0ID0gcmVjb2RlKHJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMGAgPSAiTm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSAiWWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDAuNWAgPSAiSURLIiksCiAgICAgICAgICAgcmVzcG9uc2VfdHh0ID0gZmFjdG9yKHJlc3BvbnNlX3R4dCwgbGV2ZWxzID0gYygiTm8iLCAiSURLIiwgIlllcyIpKSkgJT4lICAKICAgIGZpbHRlcighaXMubmEoY2F0ZWdvcnkpKSAgCgogICMgQ29tcHV0ZSBhdmcgcGVyIGNhdGVnb3J5ICAKICBjYXRfb3JkZXIgPC0gZGF0YV9sb25nX2NvbW0gJT4lCiAgICBncm91cF9ieShjYXRlZ29yeSkgJT4lCiAgICBzdW1tYXJpc2UobSA9IG1lYW4ocmVzcG9uc2UpKQogICAgIAoKICAjIE1lcmdlIGF2ZyBhbmQgcmVvcmRlciBjYXRlZ29yeSAgCiAgZGF0YV9sb25nX2NvbW0gPC0gZGF0YV9sb25nX2NvbW0gJT4lICAKICAgIGxlZnRfam9pbihjYXRfb3JkZXIsIGJ5ID0gImNhdGVnb3J5IikgJT4lICAKICAgIG11dGF0ZShjYXRlZ29yeSA9IGZjdF9yZW9yZGVyKGNhdGVnb3J5LCBtKSkKICAKICAgY29uZl9jb2xvcnMgPC0gc2V0TmFtZXMoYnJld2VyLnBhbCgzLCAiUmRZbEJ1IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJObyIsICJJREsiLCAiWWVzIikpCiAgCiAgIyBjb25mX2NvbG9ycyA8LSBzZXROYW1lcyhjKCIjMDE2NjVlIiwiIzVhYjRhYyIsIiM4YzUxMGEiKSwgCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBjKCJZZXMiLCAiSURLIiwgIk5vIikpCgogICMgQ3JlYXRlIHN0YWNrZWQgYmFyIHBsb3QgIApkYXRhX2xvbmdfY29tbSAlPiUKICBtdXRhdGUoY2F0ZWdvcnkgPSBmYWN0b3IoY2F0ZWdvcnksIGxldmVscyA9IGMoIk9yZGluYXJ5IiwgIlNjaWVudGlmaWMiLCAiU3VwZXJuYXR1cmFsIiwgIkZpY3Rpb25hbCIpKSwgCiAgICAgICAgIG9udF9jdHJ5X25hbWUgPSBmYWN0b3Iob250X2N0cnlfbmFtZSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjYXRlZ29yeSwgZmlsbCA9IHJlc3BvbnNlX3R4dCkpICsgIAogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArICAjIFN0YWNrZWQgcHJvcG9ydGlvbnMKICAjIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChjb3VudCkpLCAgIAogICMgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZmlsbCh2anVzdCA9IDAuNSksICAgCiAgIyAgICAgICAgICAgc2l6ZSA9IDYsIGNvbG9yID0gIndoaXRlIikgKyAgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb25mX2NvbG9ycywgZHJvcCA9IEZBTFNFKSArIAogIHRoZW1lX2J3KCkgKyAgCiAgbGFicygKICAgIHggPSAiQ2F0ZWdvcnkgb2YgSXRlbXMiLCAgCiAgICB5ID0gIlByb3BvcnRpb24gb2YgUmVzcG9uc2VzIiwgIAogICAgZmlsbCA9ICJSZXNwb25zZXMiLCAgCiAgICB0aXRsZSA9ICJDYW4gcGVvcGxlIGNvbW11bmljYXRlIHdpdGggX18/IGJ5IENhdGVnb3J5IGFuZCBGaWVsZCBTaXRlIgogICkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgYW5nbGUgPSAtMzUsIHZqdXN0ID0gMSwgaGp1c3QgPSAwKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1KSwgCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksIAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0xOCkpICsKICBmYWNldF93cmFwKH4gb250X2N0cnlfbmFtZSwgbmNvbCA9IDQpICAgIyBTZXBhcmF0ZSBwbG90cyBmb3IgZWFjaCBjb3VudHJ5CgoKYGBgCgpNb2RlbHMgcHJlZGljdGluZyAiQ2FuIHBlb3BsZSBjb21tdW5pY2F0ZSB3aXRoIFg/IiByZXNwb25zZXMgYnkgY2F0ZWdvcnkuIFRoZSBwYWlyd2lzZSBjb250cmFzdHMgZnJvbSB0aGVzZSBtb2RlbHMgYXJlIHJlcG9ydGVkIGluIHRoZSBtYW51c2NyaXB0IHVuZGVyIHRoZSBzZWN0aW9uICJBZGRpdGlvbmFsIFF1ZXN0aW9ucyBSZWZsZWN0IERpZmZlcmVuY2VzIGluIEVwaXN0ZW1pYyBGcmFtZXMiCgpgYGB7cn0KIyBJIHdhbnQgMSByZWdyZXNzaW9uIHBlciBjb3VudHJ5ICg0IHRvdGFsKSB3aGVyZSByZXNwb25zZSBpcyBwcmVkaWN0ZWQgYnkgY2F0ZWdvcnkKCiMgVVMKbS5jb21tLnVzIDwtIGxtZXIocmVzcG9uc2UgfiBjYXRlZ29yeSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGZpbHRlcihkYXRhX2xvbmdfY29tbSwgb250X2N0cnlfbmFtZSA9PSAiVVMiKSkKc3VtbWFyeShtLmNvbW0udXMpCgojI3BhaXJ3aXNlIGNvbnRyYXN0cwplbW0uY29tbS51cyA8LSBlbW1lYW5zKG0uY29tbS51cywgfiBjYXRlZ29yeSkKY29udHJhc3QoZW1tLmNvbW0udXMsIG1ldGhvZCA9ICJwYWlyd2lzZSIsIGFkanVzdCA9ICJub25lIikKCiMgR2hhbmEKbS5jb21tLmdoYW5hIDwtIGxtZXIocmVzcG9uc2UgfiBjYXRlZ29yeSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGZpbHRlcihkYXRhX2xvbmdfY29tbSwgb250X2N0cnlfbmFtZSA9PSAiR2hhbmEiKSkKc3VtbWFyeShtLmNvbW0uZ2hhbmEpCgojI3BhaXJ3aXNlIGNvbnRyYXN0cwplbW0uY29tbS5naGFuYSA8LSBlbW1lYW5zKG0uY29tbS5naGFuYSwgfiBjYXRlZ29yeSkKY29udHJhc3QoZW1tLmNvbW0uZ2hhbmEsIG1ldGhvZCA9ICJwYWlyd2lzZSIsIGFkanVzdCA9ICJub25lIikKCiMgRWN1YWRvcgptLmNvbW0uZWN1YWRvciA8LSBsbWVyKHJlc3BvbnNlIH4gY2F0ZWdvcnkgKyAoMXxvbnRfc3ViaiksIGRhdGEgPSBmaWx0ZXIoZGF0YV9sb25nX2NvbW0sIG9udF9jdHJ5X25hbWUgPT0gIkVjdWFkb3IiKSkKc3VtbWFyeShtLmNvbW0uZWN1YWRvcikKCiMjcGFpcndpc2UgY29udHJhc3RzCmVtbS5jb21tLmVjdWFkb3IgPC0gZW1tZWFucyhtLmNvbW0uZWN1YWRvciwgfiBjYXRlZ29yeSkKY29udHJhc3QoZW1tLmNvbW0uZWN1YWRvciwgbWV0aG9kID0gInBhaXJ3aXNlIiwgYWRqdXN0ID0gIm5vbmUiKQoKIyBQZXJ1Cm0uY29tbS5wZXJ1IDwtIGxtZXIocmVzcG9uc2UgfiBjYXRlZ29yeSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGZpbHRlcihkYXRhX2xvbmdfY29tbSwgb250X2N0cnlfbmFtZSA9PSAiUGVydSIpKQpzdW1tYXJ5KG0uY29tbS5wZXJ1KQoKIyNwYWlyd2lzZSBjb250cmFzdHMKZW1tLmNvbW0ucGVydSA8LSBlbW1lYW5zKG0uY29tbS5wZXJ1LCB+IGNhdGVnb3J5KQpjb250cmFzdChlbW0uY29tbS5wZXJ1LCBtZXRob2QgPSAicGFpcndpc2UiLCBhZGp1c3QgPSAibm9uZSIpCmBgYAoKIyBGaWd1cmUgMyAmIEFjY29tcGFueWluZyBBbmFseXNlcwoKYGBge3IsIGZpZy53aWR0aD0xNX0KZGF0YV9sb25nX3NwZWMgPC0gZGYgJT4lCiAgZmlsdGVyKG9udF9jdHJ5X25hbWUgJWluJSBjKCJVUyIsICJFY3VhZG9yIiwgIlBlcnUiKSkgJT4lICAjcXVlc3Rpb24gd2Fzbid0IGFza2VkIGluIGdoYW5hCiAgICBzZWxlY3Qob250X2N0cnlfbmFtZSwgb250X3N1YmosCiAgICAgICAgICAgc2NpX3NwZXhwX2dybSwgc3BuX3NwZXhwX2RlbSwgb3JkX3NwZXhwX211Zywgc2NpX3NwZXhwX2d2dCwgZmljX3NwZXhwX3NtbiwKICAgICAgICAgICBzY2lfc3BleHBfY25jLCBzcG5fc3BleHBfZ29kLCBvcmRfc3BleHBfdGJsLCBzcG5fc3BleHBfZ2hzLCBmaWNfc3BleHBfaGFwLCAgCiAgICAgICAgICAgIyBzY2lfc3BleHBfZ3JtLCBzcG5fc3BleHBfZGVtLCBvcmRfc3BleHBfbXVnLCBzY2lfc3BleHBfZnJjLCBmaWNfc3BleHBfc21uLCAgCiAgICAgICAgICAgIyBzY2lfc3BleHBfY25jLCBzcG5fc3BleHBfZ29kLCBvcmRfc3BleHBfdGJsLCBzcG5fc3BleHBfYWJzLCBmaWNfc3BleHBfa3drLCAgCiAgICAgICAgICAgc2NpX3NwZXhwX2ZsdSwgc3BuX3NwZXhwX3dlbiwgb3JkX3NwZXhwX211Zywgc2NpX3NwZXhwX3BhciwgZmljX3NwZXhwX3NwZCwgIAogICAgICAgICAgIHNjaV9zcGV4cF9jbmMsIHNwbl9zcGV4cF9nb2QsIG9yZF9zcGV4cF90YmwsIHNwbl9zcGV4cF9va3csIGZpY19zcGV4cF9yYW0sICAKICAgICAgICAgICBzcG5fc3BleHBfeXNoLCBzY2lfc3BleHBfcGFyLCBzcG5fc3BleHBfZ29kLCBvcmRfc3BleHBfdGJsLCAgCiAgICAgICAgICAgZmljX3NwZXhwX25qdCwgc3BuX3NwZXhwX2NoYSwgc2NpX3NwZXhwX2NuYywgIAogICAgICAgICAgIHNjaV9zcGV4cF9ncm0sIG5hc19zcGV4cF9yb24sIG9yZF9zcGV4cF90YXosIHNwbl9zcGV4cF9vbmksICAKICAgICAgICAgICBmaWNfc3BleHBfc21uLCBuYXNfc3BleHBfZGxwKSAlPiUgIAogICAgbXV0YXRlKGFjcm9zcyhjKC1vbnRfY3RyeV9uYW1lLCAtb250X3N1YmopLCBhcy5udW1lcmljKSkgJT4lCiAgICBwaXZvdF9sb25nZXIoYygtb250X2N0cnlfbmFtZSwgLW9udF9zdWJqKSwgbmFtZXNfdG8gPSAicXVlc3Rpb24iLCB2YWx1ZXNfdG8gPSAicmVzcG9uc2UiKSAlPiUgIAogICAgbXV0YXRlKHJlc3BvbnNlID0gaWZlbHNlKHJlc3BvbnNlID09IDk5LCAwLjUsIHJlc3BvbnNlKSkgJT4lCiAgICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSkgJT4lICAKICAgIG11dGF0ZShjYXRlZ29yeSA9IHJlY29kZShxdWVzdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX3NwZXhwX2dybSA9ICJTY2llbnRpZmljIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX3NwZXhwX2ZyYyA9ICJTY2llbnRpZmljIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9zcGV4cF9jbmMgPSAiU2NpZW50aWZpYyIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfc3BleHBfZmx1ID0gIlNjaWVudGlmaWMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX3NwZXhwX3BhciA9ICJTY2llbnRpZmljIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX3NwZXhwX2d2dCA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRfc3BleHBfbXVnID0gIk9yZGluYXJ5IiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZF9zcGV4cF90YmwgPSAiT3JkaW5hcnkiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkX3NwZXhwX3RheiA9ICJPcmRpbmFyeSIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fc3BleHBfZ29kID0gIlN1cGVybmF0dXJhbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG5fc3BleHBfZGVtID0gIlN1cGVybmF0dXJhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbl9zcGV4cF93ZW4gPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbl9zcGV4cF9va3cgPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbl9zcGV4cF9hYnMgPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbl9zcGV4cF95c2ggPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbl9zcGV4cF9jaGEgPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hc19zcGV4cF9yb24gPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbl9zcGV4cF9vbmkgPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hc19zcGV4cF9kbHAgPSAiU3VwZXJuYXR1cmFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX3NwZXhwX2docyA9ICJTdXBlcm5hdHVyYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWNfc3BleHBfa3drID0gIkZpY3Rpb25hbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWNfc3BleHBfc21uID0gIkZpY3Rpb25hbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWNfc3BleHBfc3BkID0gIkZpY3Rpb25hbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWNfc3BleHBfcmFtID0gIkZpY3Rpb25hbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWNfc3BleHBfbmp0ID0gIkZpY3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX3NwZXhwX2hhcCA9ICJGaWN0aW9uYWwiKSwgIAogICAgICAgICAgIHJlc3BvbnNlX3R4dCA9IHJlY29kZShyZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDBgID0gIkFueW9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9ICJPbmx5IHNwZWNpZmljIHBlb3BsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAwLjVgID0gIklESyIpLAogICAgICAgICAgIHJlc3BvbnNlX3R4dCA9IGZhY3RvcihyZXNwb25zZV90eHQsIGxldmVscyA9IGMoIkFueW9uZSIsICJJREsiLCAiT25seSBzcGVjaWZpYyBwZW9wbGUiKSkpICU+JSAgCiAgICBmaWx0ZXIoIWlzLm5hKGNhdGVnb3J5KSkgIAoKICAjIENvbXB1dGUgYXZnIHBlciBjYXRlZ29yeSAgCiAgY2F0X29yZGVyIDwtIGRhdGFfbG9uZ19zcGVjICU+JQogICAgZ3JvdXBfYnkoY2F0ZWdvcnkpICU+JQogICAgc3VtbWFyaXNlKG0gPSBtZWFuKHJlc3BvbnNlKSkKICAgICAKCiAgIyBNZXJnZSBhdmcgYW5kIHJlb3JkZXIgY2F0ZWdvcnkgIAogIGRhdGFfbG9uZ19zcGVjIDwtIGRhdGFfbG9uZ19zcGVjICU+JSAgCiAgICBsZWZ0X2pvaW4oY2F0X29yZGVyLCBieSA9ICJjYXRlZ29yeSIpICU+JSAgCiAgICBtdXRhdGUoY2F0ZWdvcnkgPSBmY3RfcmVvcmRlcihjYXRlZ29yeSwgbSkpCiAgCiAgY29uZl9jb2xvcnMgPC0gc2V0TmFtZXMoYnJld2VyLnBhbCgzLCAiUmRZbEJ1IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJBbnlvbmUiLCAiSURLIiwgIk9ubHkgc3BlY2lmaWMgcGVvcGxlIikpCiAgCiAgIyBjb25mX2NvbG9ycyA8LSBzZXROYW1lcyhicmV3ZXIucGFsKDMsICJTZXQyIiksIAogICMgICAgICAgICAgICAgICAgICAgICAgICAgYygiQW55b25lIiwgIklESyIsICJPbmx5IHNwZWNpZmljIHBlb3BsZSIpKQoKICAjIENyZWF0ZSBzdGFja2VkIGJhciBwbG90ICAKZGF0YV9sb25nX3NwZWMgJT4lCiAgbXV0YXRlKGNhdGVnb3J5ID0gZmFjdG9yKGNhdGVnb3J5LCBsZXZlbHMgPSBjKCJPcmRpbmFyeSIsICJTY2llbnRpZmljIiwgIlN1cGVybmF0dXJhbCIsICJGaWN0aW9uYWwiKSksIAogICAgICAgICBvbnRfY3RyeV9uYW1lID0gZmFjdG9yKG9udF9jdHJ5X25hbWUsIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY2F0ZWdvcnksIGZpbGwgPSByZXNwb25zZV90eHQpKSArICAKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyAgIyBTdGFja2VkIHByb3BvcnRpb25zCiAgIyBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoY291bnQpKSwgICAKICAjICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ZpbGwodmp1c3QgPSAwLjUpLCAgIAogICMgICAgICAgICAgIHNpemUgPSA2LCBjb2xvciA9ICJ3aGl0ZSIpICsgIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29uZl9jb2xvcnMsIGRyb3AgPSBGQUxTRSkgKyAKICB0aGVtZV9idygpICsgIAogIGxhYnMoCiAgICB4ID0gIkNhdGVnb3J5IG9mIEl0ZW1zIiwgIAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIFJlc3BvbnNlcyIsICAKICAgIGZpbGwgPSAiUmVzcG9uc2VzIiwgIAogICAgdGl0bGUgPSAiQ2FuIF9fIGJlIGV4cGVyaWVuY2VkIGJ5IGFueW9uZSBvciBvbmx5IGJ5IHNwZWNpZmljIHBlb3BsZT9cbmJ5IENhdGVnb3J5IGFuZCBGaWVsZCBTaXRlIgogICkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgYW5nbGUgPSAtMzUsIHZqdXN0ID0gMSwgaGp1c3QgPSAwKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1KSwgCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksIAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0xOCkpICsKICBmYWNldF93cmFwKH4gb250X2N0cnlfbmFtZSwgbmNvbCA9IDQpICAjIFNlcGFyYXRlIHBsb3RzIGZvciBlYWNoIGNvdW50cnkKYGBgCgpNb2RlbHMgcHJlZGljdGluZyAiQ2FuIFggYmUgZXhwZXJpZW5jZWQgYnkgYW55b25lIG9yIG9ubHkgYnkgc3BlY2lmaWMgcGVvcGxlPyIgcmVzcG9uc2VzIGJ5IGNhdGVnb3J5LiBUaGUgcGFpcndpc2UgY29udHJhc3RzIGZyb20gdGhlc2UgbW9kZWxzIGFyZSByZXBvcnRlZCBpbiB0aGUgbWFudXNjcmlwdCB1bmRlciB0aGUgc2VjdGlvbiAiQWRkaXRpb25hbCBRdWVzdGlvbnMgUmVmbGVjdCBEaWZmZXJlbmNlcyBpbiBFcGlzdGVtaWMgRnJhbWVzIgoKYGBge3J9CiMgMSByZWdyZXNzaW9uIHBlciBjb3VudHJ5ICg0IHRvdGFsKSB3aGVyZSByZXNwb25zZSBpcyBwcmVkaWN0ZWQgYnkgY2F0ZWdvcnkKCiMgVVMKbS5zcGVjLnVzIDwtIGxtZXIocmVzcG9uc2UgfiBjYXRlZ29yeSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGZpbHRlcihkYXRhX2xvbmdfc3BlYywgb250X2N0cnlfbmFtZSA9PSAiVVMiKSkKc3VtbWFyeShtLnNwZWMudXMpCgojI3BhaXJ3aXNlIGNvbnRyYXN0cwplbW0uc3BlYy51cyA8LSBlbW1lYW5zKG0uc3BlYy51cywgfiBjYXRlZ29yeSkKY29udHJhc3QoZW1tLnNwZWMudXMsIG1ldGhvZCA9ICJwYWlyd2lzZSIsIGFkanVzdCA9ICJub25lIikKCiMgRWN1YWRvcgptLnNwZWMuZWN1YWRvciA8LSBsbWVyKHJlc3BvbnNlIH4gY2F0ZWdvcnkgKyAoMXxvbnRfc3ViaiksIGRhdGEgPSBmaWx0ZXIoZGF0YV9sb25nX3NwZWMsIG9udF9jdHJ5X25hbWUgPT0gIkVjdWFkb3IiKSkKc3VtbWFyeShtLnNwZWMuZWN1YWRvcikKCiMjcGFpcndpc2UgY29udHJhc3RzCmVtbS5zcGVjLmVjdWFkb3IgPC0gZW1tZWFucyhtLnNwZWMuZWN1YWRvciwgfiBjYXRlZ29yeSkKY29udHJhc3QoZW1tLnNwZWMuZWN1YWRvciwgbWV0aG9kID0gInBhaXJ3aXNlIiwgYWRqdXN0ID0gIm5vbmUiKQoKIyBQZXJ1Cm0uc3BlYy5wZXJ1IDwtIGxtZXIocmVzcG9uc2UgfiBjYXRlZ29yeSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGZpbHRlcihkYXRhX2xvbmdfc3BlYywgb250X2N0cnlfbmFtZSA9PSAiUGVydSIpKQpzdW1tYXJ5KG0uc3BlYy5wZXJ1KQoKIyNwYWlyd2lzZSBjb250cmFzdHMKZW1tLnNwZWMucGVydSA8LSBlbW1lYW5zKG0uc3BlYy5wZXJ1LCB+IGNhdGVnb3J5KQpjb250cmFzdChlbW0uc3BlYy5wZXJ1LCBtZXRob2QgPSAicGFpcndpc2UiLCBhZGp1c3QgPSAibm9uZSIpCgpgYGAKCiMgRmlndXJlIDQgCgpDYW4gX18gYmUgc2Vuc2VkPyBUaGlzIGNvbWJpbmVzIGFjcm9zcyBhbGwgc2Vuc29yeSBxdWVzdGlvbnMgZm9yIGVhY2ggaXRlbS4gVGhlIGl0ZW1zIGRpZmZlcmVkIGZyb20gY291bnRyeSB0byBjb3VudHJ5IGFuZCB2ZXJzaW9uIHRvIHZlcnNpb24uIEJ1dCBhbG1vc3QgYWxsIGNvbnRhaW4gdGhlIHF1ZXN0aW9uczogc2VlLCBoZWFyLCBzbWVsbCwgdG91Y2gsIGZlZWwuIE1hbnkgYnV0IG5vdCBhbGwgYWxzbyBoYWQgYSB0YXN0ZSBxdWVzdGlvbi4gCgpgYGB7ciwgZmlnLndpZHRoPTEyfQojIENvbWJpbmUgYWxsIGNvdW50cnkgZGF0YQpjb21iaW5lZF9zZW5zIDwtIGRmX3NlbnMgJT4lCiAgZmlsdGVyKG9udF9jdHJ5X25hbWUgJWluJSBjKCJVUyIsICJHaGFuYSIsICJFY3VhZG9yIiwgIlBlcnUiKSkgJT4lCiAgc2VsZWN0KG9udF9jdHJ5X25hbWUsIAogICAgICAgICBzZW5zX2dybSwgc2Vuc19kZW0sIHNlbnNfbXVnLCBzZW5zX2ZyYywgc2Vuc19zbW4sCiAgICAgICAgIHNlbnNfY25jLCBzZW5zX2dvZCwgc2Vuc190YmwsIHNlbnNfYWJzLCBzZW5zX2t3aywKICAgICAgICAgc2Vuc19mbHUsIHNlbnNfd2VuLCBzZW5zX3Bhciwgc2Vuc19zcGQsIHNlbnNfb2t3LCBzZW5zX3JhbSwgCiAgICAgICAgIHNlbnNfeXNoLCBzZW5zX25qdCwgc2Vuc19jaGEsIHNlbnNfcm9uLCBzZW5zX3Rheiwgc2Vuc19vbmksIHNlbnNfZGxwCiAgICAgICAgICkgJT4lCiAgbXV0YXRlKGFjcm9zcygtb250X2N0cnlfbmFtZSwgYXMubnVtZXJpYykpICU+JQogIHBpdm90X2xvbmdlcigtb250X2N0cnlfbmFtZSwgbmFtZXNfdG8gPSAicXVlc3Rpb24iLCB2YWx1ZXNfdG8gPSAicmVzcG9uc2UiKSAlPiUKICBtdXRhdGUoCiAgICBxdWVzdGlvbl90eXBlID0gcmVjb2RlKHF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2dybSA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19mcmMgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfY25jID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2ZsdSA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19wYXIgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfbXVnID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc190YmwgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3RheiA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfZ29kID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfZGVtID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfd2VuID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfb2t3ID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfYWJzID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfeXNoID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfY2hhID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfcm9uID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfb25pID0gIlN1cGVybmF0dXJhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2RscCA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2t3ayA9ICJGaWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3NtbiA9ICJGaWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3NwZCA9ICJGaWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3JhbSA9ICJGaWN0aW9uYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19uanQgPSAiRmljdGlvbmFsIiksIAogICAgcXVlc3Rpb25fdHlwZSA9IGZhY3RvcihxdWVzdGlvbl90eXBlLCBsZXZlbHMgPSBsZXZlbHNfdHlwZSksIAogICAgb250X2N0cnlfbmFtZSA9IGZhY3RvcihvbnRfY3RyeV9uYW1lLCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkKICApICU+JQogIGZpbHRlcighaXMubmEocmVzcG9uc2UpKSAlPiUKICBncm91cF9ieShvbnRfY3RyeV9uYW1lLCBxdWVzdGlvbl90eXBlKSAlPiUKICBzdW1tYXJpc2UoCiAgICB5ZXNfY291bnQgPSBzdW0ocmVzcG9uc2UgPT0gMSksCiAgICB0b3RhbF9jb3VudCA9IG4oKSwKICAgIHByb3BvcnRpb25feWVzID0geWVzX2NvdW50IC8gdG90YWxfY291bnQKICApICU+JQogIGFycmFuZ2UoZGVzYyhwcm9wb3J0aW9uX3llcykpCgojIENhbGN1bGF0ZSBvdmVyYWxsIHByb3BvcnRpb25zIGZvciBzb3J0aW5nCm92ZXJhbGxfb3JkZXIgPC0gY29tYmluZWRfc2VucyAlPiUKICBncm91cF9ieShxdWVzdGlvbl90eXBlKSAlPiUKICBzdW1tYXJpc2Uob3ZlcmFsbF9wcm9wb3J0aW9uID0gc3VtKHllc19jb3VudCkgLyBzdW0odG90YWxfY291bnQpKSAlPiUKICBhcnJhbmdlKGRlc2Mob3ZlcmFsbF9wcm9wb3J0aW9uKSkKCiMgUmVvcmRlciBjb21iaW5lZCBkYXRhIGJ5IG92ZXJhbGwgcHJvcG9ydGlvbgpjb21iaW5lZF9zZW5zIDwtIGNvbWJpbmVkX3NlbnMgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3R5cGUgPSBmYWN0b3IocXVlc3Rpb25fdHlwZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gb3ZlcmFsbF9vcmRlciRxdWVzdGlvbl90eXBlKSkKCgojIFBsb3Qgd2l0aCByZW9yZGVyZWQgYmFycyAtLSB4IGF4aXMgaXMgY291bnRyeQpjb21iaW5lZF9zZW5zICU+JQogIGdncGxvdChhZXMoeCA9IG9udF9jdHJ5X25hbWUsIHkgPSBwcm9wb3J0aW9uX3llcywgZmlsbCA9IHF1ZXN0aW9uX3R5cGUpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHdpZHRoID0gMC43KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIsIG5hbWUgPSAiUXVlc3Rpb24gVHlwZSIpICsKICB0aGVtZV9idygpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpsYWJlbF9udW1iZXIoYWNjdXJhY3kgPSAxKShwcm9wb3J0aW9uX3llcyAqIDEwMCkpLAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgdmp1c3QgPSAyLCBzaXplID0gNSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJDYW4gX18gYmUgc2Vuc2VkPzogUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMgYnkgRmllbGQgU2l0ZSIsCiAgICB4ID0gIkZpZWxkIFNpdGUiLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIFJlc3BvbnNlcyIKICApICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIzKSwgCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksIAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0xOCkpCmBgYAoKCiMgRmlndXJlIDUgCgpgYGB7ciwgZmlnLndpZHRoPTEyfQojIENvbWJpbmUgYWxsIGNvdW50cnkgZGF0YQpjb21iaW5lZF91c2VucyA8LSBkZl91c2VucyAlPiUKICBmaWx0ZXIob250X2N0cnlfbmFtZSAlaW4lIGMoIlVTIiwgIkdoYW5hIiwgIkVjdWFkb3IiLCAiUGVydSIpKSAlPiUKICBzZWxlY3Qob250X2N0cnlfbmFtZSwgCiAgICAgICAgIHVzZW5zX2dybSwgdXNlbnNfZGVtLCB1c2Vuc19tdWcsIHVzZW5zX2ZyYywgdXNlbnNfc21uLAogICAgICAgICB1c2Vuc19jbmMsIHVzZW5zX2dvZCwgdXNlbnNfdGJsLCB1c2Vuc19hYnMsIHVzZW5zX2t3aywKICAgICAgICAgdXNlbnNfZmx1LCB1c2Vuc193ZW4sIHVzZW5zX3BhciwgdXNlbnNfc3BkLCB1c2Vuc19va3csIHVzZW5zX3JhbSwgCiAgICAgICAgIHVzZW5zX3lzaCwgdXNlbnNfbmp0LCB1c2Vuc19jaGEsIHVzZW5zX3JvbiwgdXNlbnNfdGF6LCB1c2Vuc19vbmksIHVzZW5zX2RscAogICAgICAgICApICU+JQogIG11dGF0ZShhY3Jvc3MoLW9udF9jdHJ5X25hbWUsIGFzLm51bWVyaWMpKSAlPiUKICBwaXZvdF9sb25nZXIoLW9udF9jdHJ5X25hbWUsIG5hbWVzX3RvID0gInF1ZXN0aW9uIiwgdmFsdWVzX3RvID0gInJlc3BvbnNlIikgJT4lCiAgbXV0YXRlKAogICAgcXVlc3Rpb25fdHlwZSA9IHJlY29kZShxdWVzdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfZ3JtID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19mcmMgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2NuYyA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfZmx1ID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19wYXIgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX211ZyA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX3RibCA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX3RheiA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2dvZCA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19kZW0gPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfd2VuID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX29rdyA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19hYnMgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfeXNoID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2NoYSA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19yb24gPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfb25pID0gIlN1cGVybmF0dXJhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19kbHAgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfa3drID0gIkZpY3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX3NtbiA9ICJGaWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19zcGQgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfcmFtID0gIkZpY3Rpb25hbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19uanQgPSAiRmljdGlvbmFsIiksCiAgICBxdWVzdGlvbl90eXBlID0gZmFjdG9yKHF1ZXN0aW9uX3R5cGUsIGxldmVscyA9IGxldmVsc190eXBlKSwgCiAgICBvbnRfY3RyeV9uYW1lID0gZmFjdG9yKG9udF9jdHJ5X25hbWUsIGxldmVscyA9IGxldmVsc19jb3VudHJ5KQogICkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZXNwb25zZSkpICU+JQogIGdyb3VwX2J5KG9udF9jdHJ5X25hbWUsIHF1ZXN0aW9uX3R5cGUpICU+JQogIHN1bW1hcmlzZSgKICAgIHllc19jb3VudCA9IHN1bShyZXNwb25zZSA9PSAxKSwKICAgIHRvdGFsX2NvdW50ID0gbigpLAogICAgcHJvcG9ydGlvbl95ZXMgPSB5ZXNfY291bnQgLyB0b3RhbF9jb3VudAogICkgJT4lCiAgYXJyYW5nZShkZXNjKHByb3BvcnRpb25feWVzKSkKCiMgQ2FsY3VsYXRlIG92ZXJhbGwgcHJvcG9ydGlvbnMgZm9yIHNvcnRpbmcKb3ZlcmFsbF9vcmRlciA8LSBjb21iaW5lZF91c2VucyAlPiUKICBncm91cF9ieShxdWVzdGlvbl90eXBlKSAlPiUKICBzdW1tYXJpc2Uob3ZlcmFsbF9wcm9wb3J0aW9uID0gc3VtKHllc19jb3VudCkgLyBzdW0odG90YWxfY291bnQpKSAlPiUKICBhcnJhbmdlKGRlc2Mob3ZlcmFsbF9wcm9wb3J0aW9uKSkKCiMgUmVvcmRlciBjb21iaW5lZCBkYXRhIGJ5IG92ZXJhbGwgcHJvcG9ydGlvbgpjb21iaW5lZF91c2VucyA8LSBjb21iaW5lZF91c2VucyAlPiUKICBtdXRhdGUocXVlc3Rpb25fdHlwZSA9IGZhY3RvcihxdWVzdGlvbl90eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBvdmVyYWxsX29yZGVyJHF1ZXN0aW9uX3R5cGUpKQoKCiMgUGxvdCB3aXRoIHJlb3JkZXJlZCBiYXJzIC0tIHggYXhpcyBpcyBjb3VudHJ5IApjb21iaW5lZF91c2VucyAlPiUKICBtdXRhdGUoCiAgICBxdWVzdGlvbl90eXBlID0gZmFjdG9yKHF1ZXN0aW9uX3R5cGUsIGxldmVscyA9IGxldmVsc190eXBlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gb250X2N0cnlfbmFtZSwgeSA9IHByb3BvcnRpb25feWVzLCBmaWxsID0gcXVlc3Rpb25fdHlwZSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgd2lkdGggPSAwLjcpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIiwgbmFtZSA9ICJRdWVzdGlvbiBUeXBlIikgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OmxhYmVsX251bWJlcihhY2N1cmFjeSA9IDEpKHByb3BvcnRpb25feWVzICogMTAwKSksCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLCB2anVzdCA9IDIsIHNpemUgPSA1KSArCiAgbGFicygKICAgIHRpdGxlID0gIkhhdmUgeW91IGV2ZXIgc2Vuc2VkIF9fPzogUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMgYnkgRmllbGQgU2l0ZSIsCiAgICB4ID0gIkZpZWxkIFNpdGUiLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIFJlc3BvbnNlcyIKICApICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIzKSwgCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksIAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0xOCkpCgpgYGAKCgojIFRhYmxlIDMgJiBBY2NvbXBhbnlpbmcgQW5hbHlzZXMKCk1vZGVscyBwcmVkaWN0aW5nIGNvbmZpZGVuY2UgeCBleGlzdGVuY2Ugc2NvcmVzIHdpdGggY29uc2Vuc3VzIGFuZCBzZW5zb3J5IGV4cGVyaWVuY2Ugc2NvcmVzLiBUaGUgcmVzdWx0cyBhcmUgcmVwb3J0ZWQgaW4gVGFibGUgMyBpbiB0aGUgbWFudXNjcmlwdAoKYGBge3J9CiMgZm9yIG1vcmUgZGV0YWlscyBvbiBjb25zZW5zdXMgc2NvcmUgY2FsY3VsYXRpb24sIHNlZSB0aGUgZGF0YSBmcmFtZSB3aGVyZSBpdCBpcyBjcmVhdGVkIGluIERhdGEgV3JhbmdsaW5nIAoKbS5jb25mIDwtIGxtZXIoY29uZl9kaXIgfiBjb25zZW5zdXNfZXhjbF9zZWxmICsgdXNlbnNfcmVzcG9uc2UgKyAoMSB8IG9udF9jdHJ5X25hbWUvb250X3N1YmopLCAKICAgICAgICAgICAgICBkYXRhID0gZGZfZXh0X3VzZW5zX2NvbmYpCnN1bW1hcnkobS5jb25mKQoKIyBtYWtpbmcgVGFibGUgMwptLmNvbmYgJT4lIAogICAgdGJsX3JlZ3Jlc3Npb24oaW50ZXJjZXB0ID0gVFJVRSkgJT4lIAogICAgYXNfZ3QoKSAlPiUgCiAgICBndDo6dGFiX2hlYWRlcih0aXRsZSA9ICJSZWdyZXNzaW9uIFJlc3VsdHM6IEVmZmVjdHMgb2YgQ29uc2Vuc3VzIGFuZCBTZW5zb3J5IEV2aWRlbmNlIG9uIENvbmZpZGVuY2UiKQpgYGAKCgojIEFMVEVSTkFURSBDT0RJTkcgJiBGSUcgMSBldCBhbAoKYGBge3J9CmRmX2V4dF91c2Vuc19jb25mX0FMVCA8LSBkZl9leHRfdXNlbnNfY29uZiAlPiUgCiAgbXV0YXRlKGV4dF9kaXIgPSBjYXNlX3doZW4oCiAgICByZXNwb25zZSA9PSAxIH4gMSwKICAgIHJlc3BvbnNlID09IDAgfiAtMSwKICAgIHJlc3BvbnNlID09IDAuNSB+IDAsCiAgICBUUlVFIH4gcmVzcG9uc2UpLCAKICAgIGV4dF9sYWJlbCA9IGNhc2Vfd2hlbigKICAgICAgZXh0X2RpciA9PSAxIH4gImV4aXN0IiwKICAgICAgZXh0X2RpciA9PSAtMSB+ICJub3QiLCAKICAgICAgZXh0X2RpciA9PSAwIH4gInVuc3VyZSIpLAogICAgY29uZl9kaXIgPSBjYXNlX3doZW4oCiAgICAgIGV4dF9sYWJlbCA9PSAiZXhpc3QiIH4gZXh0X2RpciArIGNvbmZfcmVzcG9uc2UsCiAgICAgIGV4dF9sYWJlbCA9PSAibm90IiB+IGV4dF9kaXIgLSBjb25mX3Jlc3BvbnNlLAogICAgICBleHRfbGFiZWwgPT0gInVuc3VyZSIgfiAwKSwKICAgIGNvbmZfZGlyX3RleHQgPSBjYXNlX3doZW4oCiAgICAgIGNvbmZfZGlyID09IC00IH4gIlZlcnkgc3VyZSBkb2Vzbid0IGV4aXN0IiwKICAgICAgY29uZl9kaXIgPT0gLTMgfiAiUHJldHR5IHN1cmUgZG9lc24ndCBleGlzdCIsCiAgICAgIGNvbmZfZGlyID09IC0yIH4gIlNvbWV3aGF0IHN1cmUgZG9lc24ndCBleGlzdCIsCiAgICAgIGNvbmZfZGlyID09IC0xIH4gIk5vdCBzdXJlIGRvZXNuJ3QgZXhpc3QiLAogICAgICBjb25mX2RpciA9PSAwIH4gIk5vdCBzdXJlIiwKICAgICAgY29uZl9kaXIgPT0gMSB+ICJOb3Qgc3VyZSBleGlzdHMiLAogICAgICBjb25mX2RpciA9PSAyIH4gIlNvbWV3aGF0IHN1cmUgZXhpc3RzIiwKICAgICAgY29uZl9kaXIgPT0gMyB+ICJQcmV0dHkgc3VyZSBleGlzdHMiLAogICAgICBjb25mX2RpciA9PSA0IH4gIlZlcnkgc3VyZSBleGlzdHMiKSwgCiAgICBjb25mX2Rpcl90ZXh0ID0gZmFjdG9yKGNvbmZfZGlyX3RleHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJWZXJ5IHN1cmUgZG9lc24ndCBleGlzdCIsICJQcmV0dHkgc3VyZSBkb2Vzbid0IGV4aXN0IiwgIlNvbWV3aGF0IHN1cmUgZG9lc24ndCBleGlzdCIsICJOb3Qgc3VyZSBkb2Vzbid0IGV4aXN0IiwgIk5vdCBzdXJlIiwgIk5vdCBzdXJlIGV4aXN0cyIsICJTb21ld2hhdCBzdXJlIGV4aXN0cyIsICJQcmV0dHkgc3VyZSBleGlzdHMiLCAiVmVyeSBzdXJlIGV4aXN0cyIpKQogICkKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTE1fQpjb25mX2NvbG9ycyA8LSAoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDksICJSZFlsQnUiKSkKCiMgQ3JlYXRlIHN0YWNrZWQgYmFyIHBsb3QgIApkZl9leHRfdXNlbnNfY29uZl9BTFQgJT4lIAogIGZpbHRlcighaXMubmEoY29uZl9kaXJfdGV4dCksICFpcy5uYShjYXRlZ29yeSkpICU+JSAKICBtdXRhdGUoY2F0ZWdvcnkgPSBmYWN0b3IoY2F0ZWdvcnksIGxldmVscyA9IGMoIk9yZGluYXJ5IiwgIlNjaWVudGlmaWMiLCAiU3VwZXJuYXR1cmFsIiwgIkZpY3Rpb25hbCIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY2F0ZWdvcnksIGZpbGwgPSBjb25mX2Rpcl90ZXh0KSkgKyAgCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgICMgU3RhY2tlZCBwcm9wb3J0aW9ucwogICMgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KGNvdW50KSksICAgCiAgIyAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9maWxsKHZqdXN0ID0gMC41KSwgICAKICAjICAgICAgICAgICBzaXplID0gNiwgY29sb3IgPSAid2hpdGUiKSArICAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbmZfY29sb3JzLCBkcm9wID0gRkFMU0UpICsgCiAgdGhlbWVfYncoKSArICAKICBsYWJzKAogICAgeCA9ICJDYXRlZ29yeSBvZiBPYmplY3RzIiwgIAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIFJlc3BvbnNlcyIsICAKICAgIGZpbGwgPSAiQ29uZmlkZW5jZSB4IEV4aXN0ZW5jZSIsICAKICAgIHRpdGxlID0gIkNvbmZpZGVuY2UgeCBFeGlzdGVuY2UgYnkgQ2F0ZWdvcnkgYW5kIENvdW50cnkiCiAgKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBhbmdsZSA9IC0zNSwgdmp1c3QgPSAxLCBoanVzdCA9IDApLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjUpLCAKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwgCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPTE4KSkgKwogIGZhY2V0X3dyYXAofiBvbnRfY3RyeV9uYW1lLCBuY29sID0gNCkgICAjIFNlcGFyYXRlIHBsb3RzIGZvciBlYWNoIGNvdW50cnkKYGBgCgpgYGB7cn0KIyAxIHJlZ3Jlc3Npb24gcGVyIGNvdW50cnkgKDQgdG90YWwpIHdoZXJlIHJlc3BvbnNlIGlzIHByZWRpY3RlZCBieSBjYXRlZ29yeQoKIyBVUwptLnVzIDwtIGxtZXIoY29uZl9kaXIgfiBxdWVzdGlvbl90eXBlICsgKDF8b250X3N1YmopLCBkYXRhID0gZmlsdGVyKGRmX2V4dF91c2Vuc19jb25mX0FMVCwgb250X2N0cnlfbmFtZSA9PSAiVVMiKSkKc3VtbWFyeShtLnVzKQoKIyNwYWlyd2lzZSBjb250cmFzdHMKZW1tLnVzIDwtIGVtbWVhbnMobS51cywgfiBxdWVzdGlvbl90eXBlKQpjb250cmFzdChlbW0udXMsIG1ldGhvZCA9ICJwYWlyd2lzZSIsIGFkanVzdCA9ICJub25lIikKCiMgR2hhbmEKbS5naGFuYSA8LSBsbWVyKGNvbmZfZGlyIH4gcXVlc3Rpb25fdHlwZSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGZpbHRlcihkZl9leHRfdXNlbnNfY29uZl9BTFQsIG9udF9jdHJ5X25hbWUgPT0gIkdoYW5hIikpCnN1bW1hcnkobS5naGFuYSkKCiMjcGFpcndpc2UgY29udHJhc3RzCmVtbS5naGFuYSA8LSBlbW1lYW5zKG0uZ2hhbmEsIH4gcXVlc3Rpb25fdHlwZSkKY29udHJhc3QoZW1tLmdoYW5hLCBtZXRob2QgPSAicGFpcndpc2UiLCBhZGp1c3QgPSAibm9uZSIpCgojIEVjdWFkb3IKbS5lY3VhZG9yIDwtIGxtZXIoY29uZl9kaXIgfiBxdWVzdGlvbl90eXBlICsgKDF8b250X3N1YmopLCBkYXRhID0gZmlsdGVyKGRmX2V4dF91c2Vuc19jb25mX0FMVCwgb250X2N0cnlfbmFtZSA9PSAiRWN1YWRvciIpKQpzdW1tYXJ5KG0uZWN1YWRvcikKCiMjcGFpcndpc2UgY29udHJhc3RzCmVtbS5lY3VhZG9yIDwtIGVtbWVhbnMobS5lY3VhZG9yLCB+IHF1ZXN0aW9uX3R5cGUpCmNvbnRyYXN0KGVtbS5lY3VhZG9yLCBtZXRob2QgPSAicGFpcndpc2UiLCBhZGp1c3QgPSAibm9uZSIpCgojIFBlcnUKbS5wZXJ1IDwtIGxtZXIoY29uZl9kaXIgfiBxdWVzdGlvbl90eXBlICsgKDF8b250X3N1YmopLCBkYXRhID0gZmlsdGVyKGRmX2V4dF91c2Vuc19jb25mX0FMVCwgb250X2N0cnlfbmFtZSA9PSAiUGVydSIpKQpzdW1tYXJ5KG0ucGVydSkKCiMjcGFpcndpc2UgY29udHJhc3RzCmVtbS5wZXJ1IDwtIGVtbWVhbnMobS5wZXJ1LCB+IHF1ZXN0aW9uX3R5cGUpCmNvbnRyYXN0KGVtbS5wZXJ1LCBtZXRob2QgPSAicGFpcndpc2UiLCBhZGp1c3QgPSAibm9uZSIpCgpgYGAKCk1vZGVsIHByZWRpY3RpbmcgY29uZmlkZW5jZSB4IGV4aXN0ZW5jZSBzY29yZXMgYnkgY2F0ZWdvcnkgcG9vbGluZyBhY3Jvc3Mgbm9uLVVTIGNvdW50cmllcy4gVGhlc2UgcmVzdWx0cyBzaG93IHRoYXQgd2hlbiB5b3UgY29tYmluZSBhbGwgbm9uLVVTIGNvdW50cnkgcmVzcG9uc2VzIHRvZ2V0aGVyLCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yZGluYXJ5IGFuZCBzdXBlcm5hdHVyYWwgY29uZmlkZW5jZSByYXRpbmdzIGFyZSBzaWduaWZpY2FudC4gCgpgYGB7cn0KI2NvbWJpbmdpbmcgbm9uIHVzIGNvdW50cmllcwptLm5vbi51cyA8LSBsbWVyKGNvbmZfZGlyIH4gcXVlc3Rpb25fdHlwZSArICgxfG9udF9jdHJ5X25hbWUvb250X3N1YmopLCBkYXRhID0gZmlsdGVyKGRmX2V4dF91c2Vuc19jb25mX0FMVCwgb250X2N0cnlfbmFtZSAhPSAiVVMiKSkKc3VtbWFyeShtLm5vbi51cykKCiMjcGFpcndpc2UgY29udHJhc3RzCmVtbS5ub24udXMgPC0gZW1tZWFucyhtLm5vbi51cywgfiBxdWVzdGlvbl90eXBlKQpjb250cmFzdChlbW0ubm9uLnVzLCBtZXRob2QgPSAicGFpcndpc2UiLCBhZGp1c3QgPSAibm9uZSIpCmBgYAoKTW9kZWwgcHJlZGljdGluZyBjb25maWRlbmNlIHggZXhpc3RlbmNlIHNjb3JlcyBieSBjYXRlZ29yeSwgYnV0IG9ubHkgZm9yIGhpZ2hlc3QgY29udHJhc3Qgb3JkaW5hcnkgdnMuIHN1cGVybmF0dXJhbCBpdGVtcyAoY29mZmVlIGN1cHMgJiB0YWJsZXMgdnMuIEdvZCAmIGRlbW9ucykuIFRoZXNlIHJlc3VsdHMgc2hvdyB0aGF0IHRoZXNlIGhpZ2hlc3QgY29udHJhc3RzIGFyZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBpbiB0aGUgVVMgYW5kIEdoYW5hLCBidXQgbm90IGluIEVjdWFkb3IgYW5kIFBlcnUgKGluIEVjdWFkb3IsIG91ciBzbWFsbGVzdCBzYW1wbGUgc2l6ZSwgdGhlcmUgYXJlIGhpbnRzIHRoYXQgdGhpcyBlZmZlY3QgbWlnaHQgYmUgZm91bmQgaW4gZnV0dXJlIHNpbWlsYXIgc3R1ZGllcykuIFNlZSBBcHBlbmRpeCBBIGZvciBmdWxsIGNvbmZpZGVuY2UgYW5kIGV4aXN0ZW5jZSByYXRpbmdzIGJyb2tlbiBkb3duIGJ5IGl0ZW0sIHZlcnNpb24sIGFuZCBjb3VudHJ5LiAKCmBgYHtyfQojIFVTIC0tbXVncywgdGFibGVzLCBnb2QsIGRlbW9ucwptLm11Zy51cyA8LSBsbWVyKGNvbmZfZGlyIH4gcXVlc3Rpb25fdHlwZSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGRmX2V4dF91c2Vuc19jb25mX0FMVCAlPiUgCiAgICAgICAgICAgICAgIGZpbHRlcihvbnRfY3RyeV9uYW1lID09ICJVUyIsCiAgICAgICAgICAgICAgICAgICAgICBpdGVtX2NvZGUgJWluJSBjKCJtdWciLCAidGJsIiwgImRlbSIsICJnb2QiKSkpCnN1bW1hcnkobS5tdWcudXMpCgojIEdoYW5hIC0tbXVncywgdGFibGVzLCBnb2QsIGRlbW9ucwptLm11Zy5naGFuYSA8LSBsbWVyKGNvbmZfZGlyIH4gcXVlc3Rpb25fdHlwZSArICgxfG9udF9zdWJqKSwgZGF0YSA9IGRmX2V4dF91c2Vuc19jb25mX0FMVCAlPiUgCiAgICAgICAgICAgICAgIGZpbHRlcihvbnRfY3RyeV9uYW1lID09ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICBpdGVtX2NvZGUgJWluJSBjKCJtdWciLCAidGJsIiwgImRlbSIsICJnb2QiKSkpCnN1bW1hcnkobS5tdWcuZ2hhbmEpCgojIEVjdWFkb3IgLS1tdWdzLCB0YWJsZXMsIGdvZCwgV2VuZQptLm11Zy5lY3VhZG9yIDwtIGxtZXIoY29uZl9kaXIgfiBxdWVzdGlvbl90eXBlICsgKDF8b250X3N1YmopLCBkYXRhID0gZGZfZXh0X3VzZW5zX2NvbmZfQUxUICU+JSAKICAgICAgICAgICAgICAgZmlsdGVyKG9udF9jdHJ5X25hbWUgPT0gIkVjdWFkb3IiLAogICAgICAgICAgICAgICAgICAgICAgaXRlbV9jb2RlICVpbiUgYygibXVnIiwgInRibCIsICJ3ZW4iLCAiZ29kIikpKSAjV2VuZSBpbnN0ZWFkIG9mIGRlbW9uCnN1bW1hcnkobS5tdWcuZWN1YWRvcikKCiMgUGVydSAtLW11Z3MsIHRhYmxlcywgZ29kLCBPbmkgSWJvIAptLm11Zy5wZXJ1IDwtIGxtZXIoY29uZl9kaXIgfiBxdWVzdGlvbl90eXBlICsgKDF8b250X3N1YmopLCBkYXRhID0gZGZfZXh0X3VzZW5zX2NvbmZfQUxUICU+JSAKICAgICAgICAgICAgICAgZmlsdGVyKG9udF9jdHJ5X25hbWUgPT0gIlBlcnUiLAogICAgICAgICAgICAgICAgICAgICAgaXRlbV9jb2RlICVpbiUgYygidGF6IiwgInRibCIsICJvbmkiLCAiZ29kIikpKQpzdW1tYXJ5KG0ubXVnLnBlcnUpCmBgYAoKIyBBcHBlbmRpeCBBOiBSZXNwb25zZXMgYnkgb2JqZWN0LCB2ZXJzaW9uLCBhbmQgY291bnRyeQoKIyMgRXhpc3RlbmNlIAoKIyMjIFVTCgpgYGB7cn0KIyBKdXN0IHZlcnNpb24gMSBxdWVzdGlvbnMtLXRoZXJlIGFyZSAyMSBwYXJ0aWNpcGFudHMKZXhpc3RfYmFyKGNvdW50cnkgPSAiVVMiLCB2ZXJzaW9uID0gMSwgCiAgICAgICAgICBjb2xzID0gYygic2NpX2V4dF9ncm0iLCAic3BuX2V4dF9kZW0iLCAib3JkX2V4dF9tdWciLCAic2NpX2V4dF9ndnQiLCAiZmljX2V4dF9zbW4iKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzY2lfZXh0X2dybSIgPSAiR2VybXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX2V4dF9kZW0iID0gIkRlbW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfZXh0X211ZyIgPSAiQ29mZmVlIE11Z3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2NpX2V4dF9ndnQiID0gIkdyYXZpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX2V4dF9zbW4iID0gIlN1cGVybWFuIiksIAogICAgICAgICAgdGl0bGUgPSAiVVMgVmVyc2lvbiAxIHJlc3BvbnNlcyB0byB3aGV0aGVyIG9iamVjdHMgZXhpc3QiLCAKICAgICAgICAgIGRhdGEgPSBkZikKCgojIFZlcnNpb24gMiAtLSAyOCBwYXJ0aWNpcGFudHMKZXhpc3RfYmFyKGNvdW50cnkgPSAiVVMiLCB2ZXJzaW9uID0gMiwgCiAgICAgICAgICBjb2xzID0gYygic2NpX2V4dF9jbmMiLCAic3BuX2V4dF9nb2QiLCAib3JkX2V4dF90YmwiLCAic3BuX2V4dF9naHMiLCAiZmljX2V4dF9oYXAiKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzY2lfZXh0X2NuYyIgPSAiQ2FuY2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9leHRfZ29kIiA9ICJHb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkX2V4dF90YmwiID0gIlRhYmxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fZXh0X2docyIgPSAiR2hvc3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19leHRfaGFwIiA9ICJIYXJyeSBQb3R0ZXIiKSwgCiAgICAgICAgICB0aXRsZSA9ICJVUyBWZXJzaW9uIDIgcmVzcG9uc2VzIHRvIHdoZXRoZXIgb2JqZWN0cyBleGlzdCIsIAogICAgICAgICAgZGF0YSA9IGRmKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIEJPVEggVkVSU0lPTlMgQ09NQklORUQgQlkgUVVFU1RJT04gVFlQRSAKdXNfZGF0YV9jb21iaW5lZCA8LSBkZiAlPiUKICBmaWx0ZXIob250X2N0cnlfbmFtZSA9PSAiVVMiKSAlPiUKICBzZWxlY3Qoc2NpX2V4dF9ncm0sIHNwbl9leHRfZGVtLCBvcmRfZXh0X211Zywgc2NpX2V4dF9ndnQsIGZpY19leHRfc21uLAogICAgICAgICBzY2lfZXh0X2NuYywgc3BuX2V4dF9nb2QsIG9yZF9leHRfdGJsLCBzcG5fZXh0X2docywgZmljX2V4dF9oYXApICU+JQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5udW1lcmljKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAicXVlc3Rpb24iLCB2YWx1ZXNfdG8gPSAicmVzcG9uc2UiKSAlPiUKICBtdXRhdGUoCiAgICBxdWVzdGlvbl90eXBlID0gcmVjb2RlKHF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfZXh0X2dybSA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2V4dF9ndnQgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9leHRfY25jID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRfZXh0X211ZyA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZF9leHRfdGJsID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9nb2QgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9kZW0gPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9naHMgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9oYXAgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9zbW4gPSAiRmljdGlvbmFsIikKICApICU+JQogIGZpbHRlcighaXMubmEocmVzcG9uc2UpKSAlPiUKICBncm91cF9ieShxdWVzdGlvbl90eXBlKSAlPiUKICBzdW1tYXJpc2UoCiAgICB5ZXNfY291bnQgPSBzdW0ocmVzcG9uc2UgPT0gMSksCiAgICB0b3RhbF9jb3VudCA9IG4oKSwKICAgIHByb3BvcnRpb25feWVzID0geWVzX2NvdW50IC8gdG90YWxfY291bnQKICApICU+JQogIGFycmFuZ2UoZGVzYyhwcm9wb3J0aW9uX3llcykpICAjIE9yZGVyIGJ5IHByb3BvcnRpb24KCiMgQ3JlYXRlIGJhciBwbG90CnVzX2RhdGFfY29tYmluZWQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90eXBlLCAtcHJvcG9ydGlvbl95ZXMpLCB5ID0gcHJvcG9ydGlvbl95ZXMsIGZpbGwgPSBxdWVzdGlvbl90eXBlKSkgKwogIGdlb21fY29sKHdpZHRoID0gMC44KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgICMgUmVtb3ZlcyB0aGUgbGVnZW5kCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChwcm9wb3J0aW9uX3llcywgYWNjdXJhY3kgPSAxKSksCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSA1KSArICAjIEFkZCAlIGFuZCBuCiAgbGFicygKICAgIHRpdGxlID0gIlVTIE9udG9sb2d5IFF1ZXN0aW9ucy0tUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMgYnkgUXVlc3Rpb24gVHlwZSIsCiAgICB4ID0gIlF1ZXN0aW9uIFR5cGUiLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mICdZZXMnIFJlc3BvbnNlcyIKICApCgpgYGAKCiMjIyBHaGFuYSAKCmBgYHtyfQojIFZlcnNpb24gMSAtLSAzNSBwYXJ0aWNpcGFudHMKZXhpc3RfYmFyKGNvdW50cnkgPSAiR2hhbmEiLCB2ZXJzaW9uID0gMSwgCiAgICAgICAgICBjb2xzID0gYygic2NpX2V4dF9ncm0iLCAic3BuX2V4dF9kZW0iLCAib3JkX2V4dF9tdWciLCAic2NpX2V4dF9mcmMiLCAiZmljX2V4dF9zbW4iKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzY2lfZXh0X2dybSIgPSAiR2VybXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX2V4dF9kZW0iID0gIkRlbW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfZXh0X211ZyIgPSAiQ29mZmVlIE11Z3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2NpX2V4dF9mcmMiID0gIkZvcmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19leHRfc21uIiA9ICJTdXBlcm1hbiIpLCAKICAgICAgICAgIHRpdGxlID0gIkdoYW5hIFZlcnNpb24gMSByZXNwb25zZXMgdG8gd2hldGhlciBvYmplY3RzIGV4aXN0IiwgCiAgICAgICAgICBkYXRhID0gZGYpCgojIFZlcnNpb24gMiAtLSAzNSBwYXJ0aWNpcGFudHMKZXhpc3RfYmFyKGNvdW50cnkgPSAiR2hhbmEiLCB2ZXJzaW9uID0gMiwgCiAgICAgICAgICBjb2xzID0gYygic2NpX2V4dF9jbmMiLCAic3BuX2V4dF9nb2QiLCAib3JkX2V4dF90YmwiLCAic3BuX2V4dF9hYnMiLCAiZmljX2V4dF9rd2siKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzY2lfZXh0X2NuYyIgPSAiQ2FuY2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9leHRfZ29kIiA9ICJHb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkX2V4dF90YmwiID0gIlRhYmxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fZXh0X2FicyIgPSAiQWJvc29tIChzbWFsbCBnb2QpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19leHRfa3drIiA9ICJLd2VrdSBBbmFuc2UgKGZpYy4gY2hhci4pIiksIAogICAgICAgICAgdGl0bGUgPSAiR2hhbmEgVmVyc2lvbiAyIHJlc3BvbnNlcyB0byB3aGV0aGVyIG9iamVjdHMgZXhpc3QiLCAKICAgICAgICAgIGRhdGEgPSBkZikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIEJPVEggVkVSU0lPTlMgQ09NQklORUQgQlkgUVVFU1RJT04gVFlQRSAKZ2hfZGF0YV9jb21iaW5lZCA8LSBkZiAlPiUKICBmaWx0ZXIob250X2N0cnlfbmFtZSA9PSAiR2hhbmEiKSAlPiUKICBzZWxlY3Qoc2NpX2V4dF9ncm0sIHNwbl9leHRfZGVtLCBvcmRfZXh0X211Zywgc2NpX2V4dF9mcmMsIGZpY19leHRfc21uLAogICAgICAgICBzY2lfZXh0X2NuYywgc3BuX2V4dF9nb2QsIG9yZF9leHRfdGJsLCBzcG5fZXh0X2FicywgZmljX2V4dF9rd2spICU+JQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5udW1lcmljKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAicXVlc3Rpb24iLCB2YWx1ZXNfdG8gPSAicmVzcG9uc2UiKSAlPiUKICBtdXRhdGUoCiAgICBxdWVzdGlvbl90eXBlID0gcmVjb2RlKHF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfZXh0X2dybSA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2V4dF9mcmMgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9leHRfY25jID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRfZXh0X211ZyA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZF9leHRfdGJsID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9nb2QgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9kZW0gPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9hYnMgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9rd2sgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9zbW4gPSAiRmljdGlvbmFsIikKICApICU+JQogIGZpbHRlcighaXMubmEocmVzcG9uc2UpKSAlPiUKICBncm91cF9ieShxdWVzdGlvbl90eXBlKSAlPiUKICBzdW1tYXJpc2UoCiAgICB5ZXNfY291bnQgPSBzdW0ocmVzcG9uc2UgPT0gMSksCiAgICB0b3RhbF9jb3VudCA9IG4oKSwKICAgIHByb3BvcnRpb25feWVzID0geWVzX2NvdW50IC8gdG90YWxfY291bnQKICApICU+JQogIGFycmFuZ2UoZGVzYyhwcm9wb3J0aW9uX3llcykpICAjIE9yZGVyIGJ5IHByb3BvcnRpb24KCiMgQ3JlYXRlIGJhciBwbG90CmdoX2RhdGFfY29tYmluZWQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90eXBlLCAtcHJvcG9ydGlvbl95ZXMpLCB5ID0gcHJvcG9ydGlvbl95ZXMsIGZpbGwgPSBxdWVzdGlvbl90eXBlKSkgKwogIGdlb21fY29sKHdpZHRoID0gMC44KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgICMgUmVtb3ZlcyB0aGUgbGVnZW5kCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChwcm9wb3J0aW9uX3llcywgYWNjdXJhY3kgPSAxKSksICAjIEFkZCB0ZXh0IG9uIHRoZSBiYXJzCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSA1KSArICAjIEFkanVzdCB0ZXh0IGFwcGVhcmFuY2UKICBsYWJzKAogICAgdGl0bGUgPSAiR2hhbmEgT250b2xvZ3kgUXVlc3Rpb25zLS1Qcm9wb3J0aW9uIG9mICdZZXMnIFJlc3BvbnNlcyBieSBRdWVzdGlvbiBUeXBlIiwKICAgIHggPSAiUXVlc3Rpb24gVHlwZSIsCiAgICB5ID0gIlByb3BvcnRpb24gb2YgJ1llcycgUmVzcG9uc2VzIikKYGBgCgojIyMgRWN1YWRvcgoKYGBge3J9CiMgVmVyc2lvbiAxIC0tIDEwIHBhcnRpY2lwYW50cyAKZXhpc3RfYmFyKGNvdW50cnkgPSAiRWN1YWRvciIsIHZlcnNpb24gPSAxLCAKICAgICAgICAgIGNvbHMgPSBjKCJzY2lfZXh0X2ZsdSIsICJzcG5fZXh0X3dlbiIsICJvcmRfZXh0X211ZyIsICJzY2lfZXh0X3BhciIsICJmaWNfZXh0X3NwZCIpLCAKICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNjaV9leHRfZmx1IiA9ICJEYWljYXdvIChmbHUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9leHRfd2VuIiA9ICJXZW5lIChkZW1vbi9mb3Jlc3QgZ29kKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfZXh0X211ZyIgPSAiQ29mZmVlIE11Z3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2NpX2V4dF9wYXIiID0gIkludGVzdGluYWwgUGFyYXNpdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19leHRfc3BkIiA9ICJTcGlkZXJtYW4iKSwgCiAgICAgICAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbiBWZXJzaW9uIDEgcmVzcG9uc2VzIHRvIHdoZXRoZXIgb2JqZWN0cyBleGlzdCIsIAogICAgICAgICAgZGF0YSA9IGRmKQoKIyBWZXJzaW9uIDIgLS0gMTAgcGFydGljaXBhbnRzCmV4aXN0X2Jhcihjb3VudHJ5ID0gIkVjdWFkb3IiLCB2ZXJzaW9uID0gMiwgCiAgICAgICAgICBjb2xzID0gYygic2NpX2V4dF9jbmMiLCAic3BuX2V4dF9nb2QiLCAib3JkX2V4dF90YmwiLCAic3BuX2V4dF9va3ciLCAiZmljX2V4dF9yYW0iKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzY2lfZXh0X2NuYyIgPSAiQ2FuY2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9leHRfZ29kIiA9ICJHb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkX2V4dF90YmwiID0gIlRhYmxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fZXh0X29rdyIgPSAiT25va2F3YSAoZ2hvc3QpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19leHRfcmFtIiA9ICJSYW1ibyIpLCAKICAgICAgICAgIHRpdGxlID0gIkVjdWFkb3JpYW4gQW1hem9uIFZlcnNpb24gMiByZXNwb25zZXMgdG8gd2hldGhlciBvYmplY3RzIGV4aXN0IiwgCiAgICAgICAgICBkYXRhID0gZGYpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIyBCT1RIIFZFUlNJT05TIENPTUJJTkVEIEJZIFFVRVNUSU9OIFRZUEUgCmVjX2RhdGFfY29tYmluZWQgPC0gZGYgJT4lCiAgZmlsdGVyKG9udF9jdHJ5X25hbWUgPT0gIkVjdWFkb3IiKSAlPiUKICBzZWxlY3Qoc2NpX2V4dF9mbHUsIHNwbl9leHRfd2VuLCBvcmRfZXh0X211Zywgc2NpX2V4dF9wYXIsIGZpY19leHRfc3BkLAogICAgICAgICBzY2lfZXh0X2NuYywgc3BuX2V4dF9nb2QsIG9yZF9leHRfdGJsLCBzcG5fZXh0X29rdywgZmljX2V4dF9yYW0pICU+JQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5udW1lcmljKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAicXVlc3Rpb24iLCB2YWx1ZXNfdG8gPSAicmVzcG9uc2UiKSAlPiUKICBtdXRhdGUoCiAgICBxdWVzdGlvbl90eXBlID0gcmVjb2RlKHF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfZXh0X2ZsdSA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2V4dF9wYXIgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9leHRfY25jID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRfZXh0X211ZyA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZF9leHRfdGJsID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9nb2QgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF93ZW4gPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9va3cgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9zcGQgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmljX2V4dF9yYW0gPSAiRmljdGlvbmFsIikKICApICU+JQogIGZpbHRlcighaXMubmEocmVzcG9uc2UpKSAlPiUKICBncm91cF9ieShxdWVzdGlvbl90eXBlKSAlPiUKICBzdW1tYXJpc2UoCiAgICB5ZXNfY291bnQgPSBzdW0ocmVzcG9uc2UgPT0gMSksCiAgICB0b3RhbF9jb3VudCA9IG4oKSwKICAgIHByb3BvcnRpb25feWVzID0geWVzX2NvdW50IC8gdG90YWxfY291bnQKICApICU+JQogIGFycmFuZ2UoZGVzYyhwcm9wb3J0aW9uX3llcykpICAjIE9yZGVyIGJ5IHByb3BvcnRpb24KCiMgQ3JlYXRlIGJhciBwbG90CmVjX2RhdGFfY29tYmluZWQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90eXBlLCAtcHJvcG9ydGlvbl95ZXMpLCB5ID0gcHJvcG9ydGlvbl95ZXMsIGZpbGwgPSBxdWVzdGlvbl90eXBlKSkgKwogIGdlb21fY29sKHdpZHRoID0gMC44KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgICMgUmVtb3ZlcyB0aGUgbGVnZW5kCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChwcm9wb3J0aW9uX3llcywgYWNjdXJhY3kgPSAxKSksICAjIEFkZCB0ZXh0IG9uIHRoZSBiYXJzCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSA1KSArICAjIEFkanVzdCB0ZXh0IGFwcGVhcmFuY2UKICBsYWJzKAogICAgdGl0bGUgPSAiRWN1YWRvcmlhbiBBbWF6b24gT250b2xvZ3kgUXVlc3Rpb25zLS1Qcm9wb3J0aW9uIG9mICdZZXMnIFJlc3BvbnNlcyBieSBRdWVzdGlvbiBUeXBlIiwKICAgIHggPSAiUXVlc3Rpb24gVHlwZSIsCiAgICB5ID0gIlByb3BvcnRpb24gb2YgJ1llcycgUmVzcG9uc2VzIikKYGBgCgojIyMgUGVydQoKYGBge3J9CiMgVmVyc2lvbiAxIC0tIDIxIHBhcnRpY2lwYW50cwpleGlzdF9iYXIoY291bnRyeSA9ICJQZXJ1IiwgdmVyc2lvbiA9IDEsIAogICAgICAgICAgY29scyA9IGMoInNwbl9leHRfeXNoIiwgInNjaV9leHRfcGFyIiwgInNwbl9leHRfZ29kIiwgIm9yZF9leHRfdGJsIiwgImZpY19leHRfbmp0IiwgInNwbl9leHRfY2hhIiwgInNjaV9leHRfY25jIiksIAogICAgICAgICAgY29sX25hbWVzID0gYygic3BuX2V4dF95c2giID0gIk1haHVhIFlvc2hpblxuKGJhZCBzcGlyaXQpIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAic2NpX2V4dF9wYXIiID0gIkludGVzdGluYWwgUGFyYXNpdGVzIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAic3BuX2V4dF9nb2QiID0gIkdvZCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9leHRfdGJsIiA9ICJUYWJsZXMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfZXh0X25qdCIgPSAiTmluamEgVHVydGxlcyIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9leHRfY2hhIiA9ICJDaGFpa29uaVxuKGludmlzaWJsZSBtYWdpYyBodW1hbnMpIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAic2NpX2V4dF9jbmMiID0gIkNhbmNlciIpLCAKICAgICAgICAgIHRpdGxlID0gIlBlcnV2aWFuIEFtYXpvbiBWZXJzaW9uIDEgcmVzcG9uc2VzIHRvIHdoZXRoZXIgb2JqZWN0cyBleGlzdCIsIAogICAgICAgICAgZGF0YSA9IGRmKQoKCiMgVmVyc2lvbiAyIC0tIDE5IHBhcnRpY2lwYW50cwpleGlzdF9iYXIoY291bnRyeSA9ICJQZXJ1IiwgdmVyc2lvbiA9IDIsIAogICAgICAgICAgY29scyA9IGMoInNjaV9leHRfZ3JtIiwgIm5hc19leHRfcm9uIiwgIm9yZF9leHRfdGF6IiwgInNwbl9leHRfb25pIiwgImZpY19leHRfc21uIiwgIm5hc19leHRfZGxwIiksIAogICAgICAgICAgY29sX25hbWVzID0gYygic2NpX2V4dF9ncm0iID0gIkdlcm1zIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYXNfZXh0X3JvbiIgPSAiUm9uaW5cbihBbmFjb25kYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkX2V4dF90YXoiID0gIkNvZmZlZSBNdWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX2V4dF9vbmkiID0gIk9uaSBJYm9cbihnb29kIHNwaXJpdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX2V4dF9zbW4iID0gIlN1cGVybWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hc19leHRfZGxwIiA9ICJKb3NoaW4gS29rb3Noa2FcbihwaW5rIHJpdmVyIGRvbHBoaW4pIiksIAogICAgICAgICAgdGl0bGUgPSAiUGVydXZpYW4gQW1hem9uIFZlcnNpb24gMiByZXNwb25zZXMgdG8gd2hldGhlciBvYmplY3RzIGV4aXN0IiwgCiAgICAgICAgICBkYXRhID0gZGYpCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBCT1RIIFZFUlNJT05TIENPTUJJTkVECgpwZXJ1X2RhdGFfY29tYmluZWQgPC0gZGYgJT4lCiAgZmlsdGVyKG9udF9jdHJ5X25hbWUgPT0gIlBlcnUiKSAlPiUKICBzZWxlY3Qoc3BuX2V4dF95c2gsIHNjaV9leHRfcGFyLCBzcG5fZXh0X2dvZCwgb3JkX2V4dF90YmwsIGZpY19leHRfbmp0LCBzcG5fZXh0X2NoYSwgc2NpX2V4dF9jbmMsCiAgICAgICAgIHNjaV9leHRfZ3JtLCBuYXNfZXh0X3Jvbiwgb3JkX2V4dF90YXosIHNwbl9leHRfb25pLCBmaWNfZXh0X3NtbiwgbmFzX2V4dF9kbHApICU+JQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5udW1lcmljKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAicXVlc3Rpb24iLCB2YWx1ZXNfdG8gPSAicmVzcG9uc2UiKSAlPiUKICBtdXRhdGUoCiAgICBxdWVzdGlvbl90eXBlID0gcmVjb2RlKHF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfZXh0X3BhciA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2V4dF9jbmMgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9leHRfZ3JtID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRfZXh0X3RheiA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZF9leHRfdGJsID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF95c2ggPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9nb2QgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9jaGEgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFzX2V4dF9yb24gPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BuX2V4dF9vbmkgPSAiU3VwZXJuYXR1cmFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hc19leHRfZGxwID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19leHRfbmp0ID0gIkZpY3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpY19leHRfc21uID0gIkZpY3Rpb25hbCIpCiAgKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSkgJT4lCiAgZ3JvdXBfYnkocXVlc3Rpb25fdHlwZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgeWVzX2NvdW50ID0gc3VtKHJlc3BvbnNlID09IDEpLAogICAgdG90YWxfY291bnQgPSBuKCksCiAgICBwcm9wb3J0aW9uX3llcyA9IHllc19jb3VudCAvIHRvdGFsX2NvdW50CiAgKSAlPiUKICBhcnJhbmdlKGRlc2MocHJvcG9ydGlvbl95ZXMpKSAgIyBPcmRlciBieSBwcm9wb3J0aW9uCgojIENyZWF0ZSBiYXIgcGxvdApwZXJ1X2RhdGFfY29tYmluZWQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90eXBlLCAtcHJvcG9ydGlvbl95ZXMpLCB5ID0gcHJvcG9ydGlvbl95ZXMsIGZpbGwgPSBxdWVzdGlvbl90eXBlKSkgKwogIGdlb21fY29sKHdpZHRoID0gMC44KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgICMgUmVtb3ZlcyB0aGUgbGVnZW5kCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChwcm9wb3J0aW9uX3llcywgYWNjdXJhY3kgPSAxKSksICAjIEFkZCB0ZXh0IG9uIHRoZSBiYXJzCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSA1KSArICAjIEFkanVzdCB0ZXh0IGFwcGVhcmFuY2UKICBsYWJzKAogICAgdGl0bGUgPSAiUGVydSBBbWF6b24gT250b2xvZ3kgUXVlc3Rpb25zLS1Qcm9wb3J0aW9uIG9mICdZZXMnIFJlc3BvbnNlcyBieSBRdWVzdGlvbiBUeXBlIiwKICAgIHggPSAiUXVlc3Rpb24gVHlwZSIsCiAgICB5ID0gIlByb3BvcnRpb24gb2YgJ1llcycgUmVzcG9uc2VzIikKYGBgCgojIyBDb25maWRlbmNlIAoKIyMjIFVTCgpgYGB7ciwgZmlnLmFzcCA9IDAuNX0KIyBWZXJzaW9uIDEtLTIxIHBhcnRpY2lwYW50cwpjb25mX2Jhcl9ieV9leGlzdGVuY2UoCiAgY291bnRyeSA9ICJVUyIsCiAgdmVyc2lvbiA9IDEsCiAgY29uZl9jb2xzID0gYygKICAgICJzY2lfY29uZi5leHRfZ3JtIiwgInNwbl9jb25mLmV4dF9kZW0iLCAib3JkX2NvbmYuZXh0X211ZyIsICJzY2lfY29uZi5leHRfZ3Z0IiwgImZpY19jb25mLmV4dF9zbW4iCiAgKSwKICBleGlzdF9jb2xzID0gYygKICAgICJzY2lfZXh0X2dybSIsICJzcG5fZXh0X2RlbSIsICJvcmRfZXh0X211ZyIsICJzY2lfZXh0X2d2dCIsICJmaWNfZXh0X3NtbiIKICApLAogIGNvbF9uYW1lcyA9IGMoCiAgICAic2NpX2NvbmYuZXh0X2dybSIgPSAiR2VybXMiLAogICAgInNwbl9jb25mLmV4dF9kZW0iID0gIkRlbW9ucyIsCiAgICAib3JkX2NvbmYuZXh0X211ZyIgPSAiQ29mZmVlIE11Z3MiLAogICAgInNjaV9jb25mLmV4dF9ndnQiID0gIkdyYXZpdHkiLAogICAgImZpY19jb25mLmV4dF9zbW4iID0gIlN1cGVybWFuIgogICksCiAgdGl0bGUgPSAiVVMgVjE6IENvbmZpZGVuY2UgYnkgQmVsaWVmIgopCgojIFZlcnNpb24gMiAtLSAyOCBwYXJ0aWNpcGFudHMKY29uZl9iYXJfYnlfZXhpc3RlbmNlKAogIGNvdW50cnkgPSAiVVMiLAogIHZlcnNpb24gPSAyLAogIGNvbmZfY29scyA9IGMoCiAgICAic2NpX2NvbmYuZXh0X2NuYyIsICJzcG5fY29uZi5leHRfZ29kIiwgIm9yZF9jb25mLmV4dF90YmwiLCAic3BuX2NvbmYuZXh0X2docyIsICJmaWNfY29uZi5leHRfaGFwIgogICksCiAgZXhpc3RfY29scyA9IGMoCiAgICAic2NpX2V4dF9jbmMiLCAic3BuX2V4dF9nb2QiLCAib3JkX2V4dF90YmwiLCAic3BuX2V4dF9naHMiLCAiZmljX2V4dF9oYXAiCiAgKSwKICBjb2xfbmFtZXMgPSBjKAogICAgInNjaV9jb25mLmV4dF9jbmMiID0gIkNhbmNlciIsCiAgICAic3BuX2NvbmYuZXh0X2dvZCIgPSAiR29kIiwKICAgICJvcmRfY29uZi5leHRfdGJsIiA9ICJUYWJsZXMiLAogICAgInNwbl9jb25mLmV4dF9naHMiID0gIkdob3N0cyIsCiAgICAiZmljX2NvbmYuZXh0X2hhcCIgPSAiSGFycnkgUG90dGVyIgogICksCiAgdGl0bGUgPSAiVVMgVjI6IENvbmZpZGVuY2UgYnkgQmVsaWVmIgopCgpgYGAKCiMjIyBHaGFuYSAKCmBgYHtyLCBmaWcuYXNwID0gMC41fQojIFZlcnNpb24gMSAtLSAzNSBwYXJ0aWNpcGFudHMKY29uZl9iYXJfYnlfZXhpc3RlbmNlKAogIGNvdW50cnkgPSAiR2hhbmEiLAogIHZlcnNpb24gPSAxLAogIGNvbmZfY29scyA9IGMoCiAgICAic2NpX2NvbmYuZXh0X2dybSIsICJzcG5fY29uZi5leHRfZGVtIiwgIm9yZF9jb25mLmV4dF9tdWciLCAic2NpX2NvbmYuZXh0X2ZyYyIsICJmaWNfY29uZi5leHRfc21uIgogICksCiAgZXhpc3RfY29scyA9IGMoCiAgICAic2NpX2V4dF9ncm0iLCAic3BuX2V4dF9kZW0iLCAib3JkX2V4dF9tdWciLCAic2NpX2V4dF9mcmMiLCAiZmljX2V4dF9zbW4iCiAgKSwKICBjb2xfbmFtZXMgPSBjKAogICAgInNjaV9jb25mLmV4dF9ncm0iID0gIkdlcm1zIiwKICAgICJzcG5fY29uZi5leHRfZGVtIiA9ICJEZW1vbnMiLAogICAgIm9yZF9jb25mLmV4dF9tdWciID0gIkNvZmZlZSBNdWdzIiwKICAgICJzY2lfY29uZi5leHRfZnJjIiA9ICJGb3JjZSIsCiAgICAiZmljX2NvbmYuZXh0X3NtbiIgPSAiU3VwZXJtYW4iCiAgKSwKICB0aXRsZSA9ICJHaGFuYSBWMTogQ29uZmlkZW5jZSBieSBCZWxpZWYiCikKCiMgVmVyc2lvbiAyIC0tIDM1IHBhcnRpY2lwYW50cwpjb25mX2Jhcl9ieV9leGlzdGVuY2UoCiAgY291bnRyeSA9ICJHaGFuYSIsCiAgdmVyc2lvbiA9IDIsCiAgY29uZl9jb2xzID0gYygKICAgICJzY2lfY29uZi5leHRfY25jIiwgInNwbl9jb25mLmV4dF9nb2QiLCAib3JkX2NvbmYuZXh0X3RibCIsICJzcG5fY29uZi5leHRfYWJzIiwgImZpY19jb25mLmV4dF9rd2siCiAgKSwKICBleGlzdF9jb2xzID0gYygKICAgICJzY2lfZXh0X2NuYyIsICJzcG5fZXh0X2dvZCIsICJvcmRfZXh0X3RibCIsICJzcG5fZXh0X2FicyIsICJmaWNfZXh0X2t3ayIKICApLAogIGNvbF9uYW1lcyA9IGMoCiAgICAic2NpX2NvbmYuZXh0X2NuYyIgPSAiQ2FuY2VyIiwKICAgICJzcG5fY29uZi5leHRfZ29kIiA9ICJHb2QiLAogICAgIm9yZF9jb25mLmV4dF90YmwiID0gIlRhYmxlcyIsCiAgICAic3BuX2NvbmYuZXh0X2FicyIgPSAiQWJvc29tXG4oc21hbGwgZ29kKSIsCiAgICAiZmljX2NvbmYuZXh0X2t3ayIgPSAiS3dla3UgQW5hbnNlXG4oZmljLiBjaGFyLikiCiAgKSwKICB0aXRsZSA9ICJHaGFuYSBWMjogQ29uZmlkZW5jZSBieSBCZWxpZWYiCikKCmBgYAoKIyMjIEVjdWFkb3IKCmBgYHtyLCBmaWcuYXNwID0gMC41fQojIFYxIDEwIHBhcnRpY2lwYW50cyAKY29uZl9iYXJfYnlfZXhpc3RlbmNlKAogIGNvdW50cnkgPSAiRWN1YWRvciIsCiAgdmVyc2lvbiA9IDEsCiAgY29uZl9jb2xzID0gYygKICAgICJzY2lfY29uZi5leHRfZmx1IiwgInNwbl9jb25mLmV4dF93ZW4iLCAib3JkX2NvbmYuZXh0X211ZyIsICJzY2lfY29uZi5leHRfcGFyIiwgImZpY19jb25mLmV4dF9zcGQiCiAgKSwKICBleGlzdF9jb2xzID0gYygKICAgICJzY2lfZXh0X2ZsdSIsICJzcG5fZXh0X3dlbiIsICJvcmRfZXh0X211ZyIsICJzY2lfZXh0X3BhciIsICJmaWNfZXh0X3NwZCIKICApLAogIGNvbF9uYW1lcyA9IGMoCiAgICAic2NpX2NvbmYuZXh0X2ZsdSIgPSAiRGFpY2F3byAoZmx1KSIsCiAgICAic3BuX2NvbmYuZXh0X3dlbiIgPSAiV2VuZVxuKGRlbW9uL2ZvcmVzdCBnb2QpIiwKICAgICJvcmRfY29uZi5leHRfbXVnIiA9ICJDb2ZmZWUgTXVncyIsCiAgICAic2NpX2NvbmYuZXh0X3BhciIgPSAiSW50ZXN0aW5hbCBQYXJhc2l0ZXMiLAogICAgImZpY19jb25mLmV4dF9zcGQiID0gIlNwaWRlcm1hbiIKICApLAogIHRpdGxlID0gIkVjdWFkb3JpYW4gQW1hem9uIFYxOiBDb25maWRlbmNlIGJ5IEJlbGllZiIKKQoKIyBWMiAxMCBwYXJ0aWNpcGFudHMKY29uZl9iYXJfYnlfZXhpc3RlbmNlKAogIGNvdW50cnkgPSAiRWN1YWRvciIsCiAgdmVyc2lvbiA9IDIsCiAgY29uZl9jb2xzID0gYygKICAgICJzY2lfY29uZi5leHRfY25jIiwgInNwbl9jb25mLmV4dF9nb2QiLCAib3JkX2NvbmYuZXh0X3RibCIsICJzcG5fY29uZi5leHRfb2t3IiwgImZpY19jb25mLmV4dF9yYW0iCiAgKSwKICBleGlzdF9jb2xzID0gYygKICAgICJzY2lfZXh0X2NuYyIsICJzcG5fZXh0X2dvZCIsICJvcmRfZXh0X3RibCIsICJzcG5fZXh0X29rdyIsICJmaWNfZXh0X3JhbSIKICApLAogIGNvbF9uYW1lcyA9IGMoCiAgICAic2NpX2NvbmYuZXh0X2NuYyIgPSAiQ2FuY2VyIiwKICAgICJzcG5fY29uZi5leHRfZ29kIiA9ICJHb2QiLAogICAgIm9yZF9jb25mLmV4dF90YmwiID0gIlRhYmxlcyIsCiAgICAic3BuX2NvbmYuZXh0X29rdyIgPSAiT25va2F3YVxuKGdob3N0KSIsCiAgICAiZmljX2NvbmYuZXh0X3JhbSIgPSAiUmFtYm8iCiAgKSwKICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbiBWMjogQ29uZmlkZW5jZSBieSBCZWxpZWYiCikKCmBgYAoKIyMjIFBlcnUKCmBgYHtyLCBmaWcuYXNwID0gMC41fQojIFYxIC0tIDIxIHBhcnRpY2lwYW50cwpjb25mX2Jhcl9ieV9leGlzdGVuY2UoCiAgY291bnRyeSA9ICJQZXJ1IiwKICB2ZXJzaW9uID0gMSwKICBjb25mX2NvbHMgPSBjKAogICAgInNwbl9jb25mLmV4dF95c2giLCAic2NpX2NvbmYuZXh0X3BhciIsICJzcG5fY29uZi5leHRfZ29kIiwgIm9yZF9jb25mLmV4dF90YmwiLCAiZmljX2NvbmYuZXh0X25qdCIsIAogICAgInNwbl9jb25mLmV4dF9jaGEiLCAic2NpX2NvbmYuZXh0X2NuYyIKICApLAogIGV4aXN0X2NvbHMgPSBjKAogICAgInNwbl9leHRfeXNoIiwgInNjaV9leHRfcGFyIiwgInNwbl9leHRfZ29kIiwgIm9yZF9leHRfdGJsIiwgImZpY19leHRfbmp0IiwgInNwbl9leHRfY2hhIiwgInNjaV9leHRfY25jIgogICksCiAgY29sX25hbWVzID0gYygKICAgICJzcG5fY29uZi5leHRfeXNoIiA9ICJNYWh1YSBZb3NoaW5cbihiYWQgc3Bpcml0KSIsCiAgICAic2NpX2NvbmYuZXh0X3BhciIgPSAiSW50ZXN0aW5hbCBQYXJhc2l0ZXMiLAogICAgInNwbl9jb25mLmV4dF9nb2QiID0gIkdvZCIsCiAgICAib3JkX2NvbmYuZXh0X3RibCIgPSAiVGFibGVzIiwKICAgICJmaWNfY29uZi5leHRfbmp0IiA9ICJOaW5qYSBUdXJ0bGVzIiwKICAgICJzcG5fY29uZi5leHRfY2hhIiA9ICJDaGFpa29uaVxuKGludmlzaWJsZSBtYWdpYyBodW1hbnMpIiwKICAgICJzY2lfY29uZi5leHRfY25jIiA9ICJDYW5jZXIiCiAgKSwKICB0aXRsZSA9ICJQZXJ1dmlhbiBBbWF6b24gVjE6IENvbmZpZGVuY2UgYnkgQmVsaWVmIgopCgoKIyBWMiAtLSAxOSBwYXJ0aWNpcGFudHMKY29uZl9iYXJfYnlfZXhpc3RlbmNlKAogIGNvdW50cnkgPSAiUGVydSIsCiAgdmVyc2lvbiA9IDIsCiAgY29uZl9jb2xzID0gYygKICAgICJzY2lfY29uZi5leHRfZ3JtIiwgIm5hc19jb25mLmV4dF9yb24iLCAib3JkX2NvbmYuZXh0X3RheiIsICJzcG5fY29uZi5leHRfb25pIiwgImZpY19jb25mLmV4dF9zbW4iLCAibmFzX2NvbmYuZXh0X2RscCIKICApLAogIGV4aXN0X2NvbHMgPSBjKAogICAgInNjaV9leHRfZ3JtIiwgIm5hc19leHRfcm9uIiwgIm9yZF9leHRfdGF6IiwgInNwbl9leHRfb25pIiwgImZpY19leHRfc21uIiwgIm5hc19leHRfZGxwIgogICksCiAgY29sX25hbWVzID0gYygKICAgICJzY2lfY29uZi5leHRfZ3JtIiA9ICJHZXJtcyIsCiAgICAibmFzX2NvbmYuZXh0X3JvbiIgPSAiUm9uaW5cbihBbmFjb25kYSkiLAogICAgIm9yZF9jb25mLmV4dF90YXoiID0gIkNvZmZlZSBNdWciLAogICAgInNwbl9jb25mLmV4dF9vbmkiID0gIk9uaSBJYm9cbihnb29kIHNwaXJpdCkiLAogICAgImZpY19jb25mLmV4dF9zbW4iID0gIlN1cGVybWFuIiwKICAgICJuYXNfY29uZi5leHRfZGxwIiA9ICJKb3NoaW4gS29rb3Noa2FcbihwaW5rIHJpdmVyIGRvbHBoaW4pIgogICksCiAgdGl0bGUgPSAiUGVydXZpYW4gQW1hem9uIFYyOiBDb25maWRlbmNlIGJ5IEJlbGllZiIKKQoKYGBgCgojIyBDb21tdW5pY2F0aW9uIAoKIyMjIFVTCgpgYGB7cn0KeW5fc3RhY2tlZF9iYXIoY291bnRyeSA9ICJVUyIsIHZlcnNpb24gPSAxLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic2NpX2NvbXVfZ3JtIiwgInNwbl9jb211X2RlbSIsICJvcmRfY29tdV9tdWciLCAic2NpX2NvbXVfZ3Z0IiwgImZpY19jb211X3NtbiIpLCAKICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzY2lfY29tdV9ncm0iID0gIkdlcm1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9jb211X2RlbSIgPSAiRGVtb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9jb211X211ZyIgPSAiQ29mZmVlIE11Z3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2NpX2NvbXVfZ3Z0IiA9ICJHcmF2aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19jb211X3NtbiIgPSAiU3VwZXJtYW4iKSwgCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiVVMgVjE6IENhbiBwZW9wbGUgY29tbXVuaWNhdGUgd2l0aCBfXz8iKQoKIyBWZXJzaW9uIDIgLS0gMjggcGFydGljaXBhbnRzCnluX3N0YWNrZWRfYmFyKGNvdW50cnkgPSAiVVMiLCB2ZXJzaW9uID0gMiwgCiAgICAgICAgICAgICAgICAgY29scyA9IGMoInNjaV9jb211X2NuYyIsICJzcG5fY29tdV9nb2QiLCAib3JkX2NvbXVfdGJsIiwgInNwbl9jb211X2docyIsICJmaWNfY29tdV9oYXAiKSwgCiAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gYygic2NpX2NvbXVfY25jIiA9ICJDYW5jZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX2NvbXVfZ29kIiA9ICJHb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfY29tdV90YmwiID0gIlRhYmxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV9naHMiID0gIkdob3N0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9oYXAiID0gIkhhcnJ5IFBvdHRlciIpLCAKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJVUyBWMjogQ2FuIHBlb3BsZSBjb21tdW5pY2F0ZSB3aXRoIF9fPyIpCgojIEJvdGggdmVyc2lvbnMgdG9nZXRoZXIKeW5fYnlfY2F0ZWdvcnkoY291bnRyeSA9ICJVUyIsIAogICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJzY2lfY29tdV9ncm0iLCAic3BuX2NvbXVfZGVtIiwgIm9yZF9jb211X211ZyIsICJzY2lfY29tdV9ndnQiLCAiZmljX2NvbXVfc21uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAic2NpX2NvbXVfY25jIiwgInNwbl9jb211X2dvZCIsICJvcmRfY29tdV90YmwiLCAic3BuX2NvbXVfZ2hzIiwgImZpY19jb211X2hhcCIpLAogICAgICAgICAgICAgICAgIGNhdGVnb3J5X21hcHBpbmcgPSBjKCJzY2lfY29tdV9ncm0iID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX2NvbXVfZGVtIiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkX2NvbXVfbXVnIiA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfY29tdV9ndnQiID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX2NvbXVfc21uIiA9ICJGaWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2NpX2NvbXVfY25jIiA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9jb211X2dvZCIgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9jb211X3RibCIgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX2NvbXVfZ2hzIiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX2NvbXVfaGFwIiA9ICJGaWN0aW9uYWwiKSwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJVUzogQ2FuIHBlb3BsZSBjb21tdW5pY2F0ZSB3aXRoIF9fPyIKICAgICAgICAgICAgICAgICApCmBgYAoKIyMjIEdoYW5hIAoKYGBge3J9CiMgVmVyc2lvbiAxIC0tIDM1IHBhcnRpY2lwYW50cyBieSBpdGVtIGFuZCB2ZXJzaW9uCnluX3N0YWNrZWRfYmFyKGNvdW50cnkgPSAiR2hhbmEiLCB2ZXJzaW9uID0gMSwgCiAgICAgICAgICAgICAgICAgY29scyA9IGMoInNjaV9jb211X2dybSIsICJzcG5fY29tdV9kZW0iLCAib3JkX2NvbXVfbXVnIiwgInNjaV9jb211X2ZyYyIsICJmaWNfY29tdV9zbW4iKSwgCiAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gYygic2NpX2NvbXVfZ3JtIiA9ICJHZXJtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV9kZW0iID0gIkRlbW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfY29tdV9tdWciID0gIkNvZmZlZSBNdWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9jb211X2ZyYyIgPSAiRm9yY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX2NvbXVfc21uIiA9ICJTdXBlcm1hbiIpLCAKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJHaGFuYSBWMTogQ2FuIHBlb3BsZSBjb21tdW5pY2F0ZSB3aXRoIF9fPyIpCgojIFZlcnNpb24gMiAtLSAzNSBwYXJ0aWNpcGFudHMgYnkgaXRlbSBhbmQgdmVyc2lvbgp5bl9zdGFja2VkX2Jhcihjb3VudHJ5ID0gIkdoYW5hIiwgdmVyc2lvbiA9IDIsIAogICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJzY2lfY29tdV9jbmMiLCAic3BuX2NvbXVfZ29kIiwgIm9yZF9jb211X3RibCIsICJzcG5fY29tdV9hYnMiLCAiZmljX2NvbXVfa3drIiksIAogICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNjaV9jb211X2NuYyIgPSAiQ2FuY2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9jb211X2dvZCIgPSAiR29kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9jb211X3RibCIgPSAiVGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9jb211X2FicyIgPSAiQWJvc29tXG4oc21hbGwgZ29kKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9rd2siID0gIkt3ZWt1IEFuYW5zZVxuKGZpYy4gY2hhci4pIiksIAogICAgICAgICAgICAgICAgIHRpdGxlID0gIkdoYW5hIFYyOiBDYW4gcGVvcGxlIGNvbW11bmljYXRlIHdpdGggX18/IikKCiMgQm90aCB2ZXJzaW9ucyB0b2dldGhlcgp5bl9ieV9jYXRlZ29yeShjb3VudHJ5ID0gIkdoYW5hIiwgCiAgICAgICAgICAgICAgICAgY29scyA9IGMoInNjaV9jb211X2dybSIsICJzcG5fY29tdV9kZW0iLCAib3JkX2NvbXVfbXVnIiwgInNjaV9jb211X2ZyYyIsICJmaWNfY29tdV9zbW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfY29tdV9jbmMiLCAic3BuX2NvbXVfZ29kIiwgIm9yZF9jb211X3RibCIsICJzcG5fY29tdV9hYnMiLCAiZmljX2NvbXVfa3drIiksCiAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfbWFwcGluZyA9IGMoInNjaV9jb211X2dybSIgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV9kZW0iID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfY29tdV9tdWciID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9jb211X2ZyYyIgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9zbW4iID0gIkZpY3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfY29tdV9jbmMiID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX2NvbXVfZ29kIiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkX2NvbXVfdGJsIiA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV9hYnMiID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9rd2siID0gIkZpY3Rpb25hbCIpLAogICAgICAgICAgICAgICAgIHRpdGxlID0gIkdoYW5hOiBDYW4gcGVvcGxlIGNvbW11bmljYXRlIHdpdGggX18/IgogICAgICAgICAgICAgICAgICkKYGBgCgojIyMgRWN1YWRvcgoKYGBge3J9CiMgVmVyc2lvbiAxIC0tIDEwIHBhcnRpY2lwYW50cyAKeW5fc3RhY2tlZF9iYXIoY291bnRyeSA9ICJFY3VhZG9yIiwgdmVyc2lvbiA9IDEsIAogICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJzY2lfY29tdV9mbHUiLCAic3BuX2NvbXVfd2VuIiwgIm9yZF9jb211X211ZyIsICJzY2lfY29tdV9wYXIiLCAiZmljX2NvbXVfc3BkIiksIAogICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNjaV9jb211X2ZsdSIgPSAiRGFpY2F3byAoZmx1KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV93ZW4iID0gIldlbmVcbihkZW1vbi9mb3Jlc3QgZ29kKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfY29tdV9tdWciID0gIkNvZmZlZSBNdWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9jb211X3BhciIgPSAiSW50ZXN0aW5hbCBQYXJhc2l0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX2NvbXVfc3BkIiA9ICJTcGlkZXJtYW4iKSwgCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiRWN1YWRvcmlhbiBBbWF6b24gVjE6IENhbiBwZW9wbGUgY29tbXVuaWNhdGUgd2l0aCBfXz8iKQoKIyBWZXJzaW9uIDIgLS0gMTAgcGFydGljaXBhbnRzCnluX3N0YWNrZWRfYmFyKGNvdW50cnkgPSAiRWN1YWRvciIsIHZlcnNpb24gPSAyLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic2NpX2NvbXVfY25jIiwgInNwbl9jb211X2dvZCIsICJvcmRfY29tdV90YmwiLCAic3BuX2NvbXVfb2t3IiwgImZpY19jb211X3JhbSIpLCAKICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzY2lfY29tdV9jbmMiID0gIkNhbmNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV9nb2QiID0gIkdvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfY29tdV90YmwiID0gIlRhYmxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV9va3ciID0gIk9ub2thd2FcbihnaG9zdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX2NvbXVfcmFtIiA9ICJSYW1ibyIpLCAKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbiBWMjogQ2FuIHBlb3BsZSBjb21tdW5pY2F0ZSB3aXRoIF9fPyIpCgojIEJvdGggdmVyc2lvbnMgdG9nZXRoZXIKeW5fYnlfY2F0ZWdvcnkoY291bnRyeSA9ICJFY3VhZG9yIiwgCiAgICAgICAgICAgICAgICAgY29scyA9IGMoInNjaV9jb211X2ZsdSIsICJzcG5fY29tdV93ZW4iLCAib3JkX2NvbXVfbXVnIiwgInNjaV9jb211X3BhciIsICJmaWNfY29tdV9zcGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfY29tdV9jbmMiLCAic3BuX2NvbXVfZ29kIiwgIm9yZF9jb211X3RibCIsICJzcG5fY29tdV9va3ciLCAiZmljX2NvbXVfcmFtIiksCiAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfbWFwcGluZyA9IGMoInNjaV9jb211X2ZsdSIgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV93ZW4iID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfY29tdV9tdWciID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9jb211X3BhciIgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9zcGQiID0gIkZpY3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfY29tdV9jbmMiID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX2NvbXVfZ29kIiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkX2NvbXVfdGJsIiA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV9va3ciID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9yYW0iID0gIkZpY3Rpb25hbCIpLAogICAgICAgICAgICAgICAgIHRpdGxlID0gIkVjdWFkb3JpYW4gQW1hem9uOiBDYW4gcGVvcGxlIGNvbW11bmljYXRlIHdpdGggX18/IgogICAgICAgICAgICAgICAgICkKYGBgCgojIyMgUGVydQoKYGBge3J9CiMgVmVyc2lvbiAxIC0tIDIxIHBhcnRpY2lwYW50cwp5bl9zdGFja2VkX2Jhcihjb3VudHJ5ID0gIlBlcnUiLCB2ZXJzaW9uID0gMSwgCiAgICAgICAgICAgICAgICAgY29scyA9IGMoInNwbl9jb211X3lzaCIsICJzY2lfY29tdV9wYXIiLCAic3BuX2NvbXVfZ29kIiwgIm9yZF9jb211X3RibCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9uanQiLCAic3BuX2NvbXVfY2hhIiwgInNjaV9jb211X2NuYyIpLCAKICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzcG5fY29tdV95c2giID0gIk1haHVhIFlvc2hpblxuKGJhZCBzcGlyaXQpIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAic2NpX2NvbXVfcGFyIiA9ICJJbnRlc3RpbmFsIFBhcmFzaXRlcyIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9jb211X2dvZCIgPSAiR29kIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAib3JkX2NvbXVfdGJsIiA9ICJUYWJsZXMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9uanQiID0gIk5pbmphIFR1cnRsZXMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV9jaGEiID0gIkNoYWlrb25pXG4oaW52aXNpYmxlIG1hZ2ljIGh1bWFucykiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfY29tdV9jbmMiID0gIkNhbmNlciIpLCAKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJQZXJ1dmlhbiBBbWF6b24gVjE6IENhbiBwZW9wbGUgY29tbXVuaWNhdGUgd2l0aCBfXz8iKQoKIyBWZXJzaW9uIDIgLS0gMTkgcGFydGljaXBhbnRzCnluX3N0YWNrZWRfYmFyKGNvdW50cnkgPSAiUGVydSIsIHZlcnNpb24gPSAyLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic2NpX2NvbXVfZ3JtIiwgIm5hc19jb211X3JvbiIsICJvcmRfY29tdV90YXoiLCAic3BuX2NvbXVfb25pIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19jb211X3NtbiIsICJuYXNfY29tdV9kbHAiKSwgCiAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gYygic2NpX2NvbXVfZ3JtIiA9ICJHZXJtcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAibmFzX2NvbXVfcm9uIiA9ICJSb25pblxuKEFuYWNvbmRhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfY29tdV90YXoiID0gIkNvZmZlZSBNdWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX2NvbXVfb25pIiA9ICJPbmkgSWJvXG4oZ29vZCBzcGlyaXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19jb211X3NtbiIgPSAiU3VwZXJtYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibmFzX2NvbXVfZGxwIiA9ICJKb3NoaW4gS29rb3Noa2FcbihwaW5rIHJpdmVyIGRvbHBoaW4pIiksIAogICAgICAgICAgICAgICAgIHRpdGxlID0gIlBlcnV2aWFuIEFtYXpvbiBWMjogQ2FuIHBlb3BsZSBjb21tdW5pY2F0ZSB3aXRoIF9fPyIpCgojIEJvdGggdmVyc2lvbnMgdG9nZXRoZXIKeW5fYnlfY2F0ZWdvcnkoY291bnRyeSA9ICJQZXJ1IiwgCiAgICAgICAgICAgICAgICAgY29scyA9IGMoInNwbl9jb211X3lzaCIsICJzY2lfY29tdV9wYXIiLCAic3BuX2NvbXVfZ29kIiwgIm9yZF9jb211X3RibCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9uanQiLCAic3BuX2NvbXVfY2hhIiwgInNjaV9jb211X2NuYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9jb211X2dybSIsICJuYXNfY29tdV9yb24iLCAib3JkX2NvbXVfdGF6IiwgInNwbl9jb211X29uaSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfY29tdV9zbW4iLCAibmFzX2NvbXVfZGxwIiksCiAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfbWFwcGluZyA9IGMoInNwbl9jb211X3lzaCIgPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAic2NpX2NvbXVfcGFyIiA9ICJTY2llbnRpZmljIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAic3BuX2NvbXVfZ29kIiA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfY29tdV90YmwiID0gIk9yZGluYXJ5IiwgIAogICAgICAgICAgICAgICAgICAgICAgICAiZmljX2NvbXVfbmp0IiA9ICJGaWN0aW9uYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fY29tdV9jaGEiID0gIlN1cGVybmF0dXJhbCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9jb211X2NuYyIgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfY29tdV9ncm0iID0gIlNjaWVudGlmaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIm5hc19jb211X3JvbiIgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9jb211X3RheiIgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3BuX2NvbXVfb25pIiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZmljX2NvbXVfc21uIiA9ICJGaWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFzX2NvbXVfZGxwIiA9ICJTdXBlcm5hdHVyYWwiKSwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJQZXJ1dmlhbiBBbWF6b246IENhbiBwZW9wbGUgY29tbXVuaWNhdGUgd2l0aCBfXz8iCiAgICAgICAgICAgICAgICAgKQpgYGAKCiMjIFNwZWNpYWwgUGVvcGxlIAoKIyMjIFVTCgpgYGB7cn0Kc3BleHBfc3RhY2tlZF9iYXIoY291bnRyeSA9ICJVUyIsIHZlcnNpb24gPSAxLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic2NpX3NwZXhwX2dybSIsICJzcG5fc3BleHBfZGVtIiwgIm9yZF9zcGV4cF9tdWciLCAic2NpX3NwZXhwX2d2dCIsICJmaWNfc3BleHBfc21uIiksIAogICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNjaV9zcGV4cF9ncm0iID0gIkdlcm1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9zcGV4cF9kZW0iID0gIkRlbW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfc3BleHBfbXVnIiA9ICJDb2ZmZWUgTXVncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfc3BleHBfZ3Z0IiA9ICJHcmF2aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19zcGV4cF9zbW4iID0gIlN1cGVybWFuIiksIAogICAgICAgICAgICAgICAgIHRpdGxlID0gIlVTIFYxOiBDYW4gX18gYmUgZXhwZXJpZW5jZWQgYnkgYW55b25lIG9yIG9ubHkgYnkgc3BlY2lmaWMgcGVvcGxlPyIpCgojIFZlcnNpb24gMiAtLSAyOCBwYXJ0aWNpcGFudHMKc3BleHBfc3RhY2tlZF9iYXIoY291bnRyeSA9ICJVUyIsIHZlcnNpb24gPSAyLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic2NpX3NwZXhwX2NuYyIsICJzcG5fc3BleHBfZ29kIiwgIm9yZF9zcGV4cF90YmwiLCAic3BuX3NwZXhwX2docyIsICJmaWNfc3BleHBfaGFwIiksIAogICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNjaV9zcGV4cF9jbmMiID0gIkNhbmNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fc3BleHBfZ29kIiA9ICJHb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfc3BleHBfdGJsIiA9ICJUYWJsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX3NwZXhwX2docyIgPSAiR2hvc3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19zcGV4cF9oYXAiID0gIkhhcnJ5IFBvdHRlciIpLCAKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJVUyBWMjogQ2FuIF9fIGJlIGV4cGVyaWVuY2VkIGJ5IGFueW9uZSBvciBvbmx5IGJ5IHNwZWNpZmljIHBlb3BsZT8iKQoKIyBCb3RoIHZlcnNpb25zIHRvZ2V0aGVyCnNwZXhwX2J5X2NhdGVnb3J5KGNvdW50cnkgPSAiVVMiLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic2NpX3NwZXhwX2dybSIsICJzcG5fc3BleHBfZGVtIiwgIm9yZF9zcGV4cF9tdWciLCAic2NpX3NwZXhwX2d2dCIsICJmaWNfc3BleHBfc21uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAic2NpX3NwZXhwX2NuYyIsICJzcG5fc3BleHBfZ29kIiwgIm9yZF9zcGV4cF90YmwiLCAic3BuX3NwZXhwX2docyIsICJmaWNfc3BleHBfaGFwIiksCiAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfbWFwcGluZyA9IGMoInNjaV9zcGV4cF9ncm0iID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX3NwZXhwX2RlbSIgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9zcGV4cF9tdWciID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9zcGV4cF9ndnQiID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX3NwZXhwX3NtbiIgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9zcGV4cF9jbmMiID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX3NwZXhwX2dvZCIgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9zcGV4cF90YmwiID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9zcGV4cF9naHMiID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfc3BleHBfaGFwIiA9ICJGaWN0aW9uYWwiKSwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJVUzogQ2FuIF9fIGJlIGV4cGVyaWVuY2VkIGJ5IGFueW9uZSBvciBvbmx5IGJ5IHNwZWNpZmljIHBlb3BsZT8iCiAgICAgICAgICAgICAgICAgKQpgYGAKCiMjIyBHaGFuYSAKClRoaXMgcXVlc3Rpb24gd2FzIG5vdCBhc2tlZCBpbiBHaGFuYQoKIyMjIEVjdWFkb3IKCmBgYHtyfQojIFZlcnNpb24gMSAtLSAxMCBwYXJ0aWNpcGFudHMgCnNwZXhwX3N0YWNrZWRfYmFyKGNvdW50cnkgPSAiRWN1YWRvciIsIHZlcnNpb24gPSAxLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic2NpX3NwZXhwX2ZsdSIsICJzcG5fc3BleHBfd2VuIiwgIm9yZF9zcGV4cF9tdWciLCAic2NpX3NwZXhwX3BhciIsICJmaWNfc3BleHBfc3BkIiksIAogICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNjaV9zcGV4cF9mbHUiID0gIkRhaWNhd28gKGZsdSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX3NwZXhwX3dlbiIgPSAiV2VuZVxuKGRlbW9uL2ZvcmVzdCBnb2QpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9zcGV4cF9tdWciID0gIkNvZmZlZSBNdWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9zcGV4cF9wYXIiID0gIkludGVzdGluYWwgUGFyYXNpdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19zcGV4cF9zcGQiID0gIlNwaWRlcm1hbiIpLCAKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbiBWMTogQ2FuIF9fIGJlIGV4cGVyaWVuY2VkIGJ5IGFueW9uZSBvciBvbmx5IGJ5IHNwZWNpZmljIHBlb3BsZT8iKQoKIyBWZXJzaW9uIDIgLS0gMTAgcGFydGljaXBhbnRzCnNwZXhwX3N0YWNrZWRfYmFyKGNvdW50cnkgPSAiRWN1YWRvciIsIHZlcnNpb24gPSAyLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic2NpX3NwZXhwX2NuYyIsICJzcG5fc3BleHBfZ29kIiwgIm9yZF9zcGV4cF90YmwiLCAic3BuX3NwZXhwX29rdyIsICJmaWNfc3BleHBfcmFtIiksIAogICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNjaV9zcGV4cF9jbmMiID0gIkNhbmNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fc3BleHBfZ29kIiA9ICJHb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkX3NwZXhwX3RibCIgPSAiVGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9zcGV4cF9va3ciID0gIk9ub2thd2FcbihnaG9zdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX3NwZXhwX3JhbSIgPSAiUmFtYm8iKSwgCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiRWN1YWRvcmlhbiBBbWF6b24gVjI6IENhbiBfXyBiZSBleHBlcmllbmNlZCBieSBhbnlvbmUgb3Igb25seSBieSBzcGVjaWZpYyBwZW9wbGU/IikKCiMgQm90aCB2ZXJzaW9ucyB0b2dldGhlcgpzcGV4cF9ieV9jYXRlZ29yeShjb3VudHJ5ID0gIkVjdWFkb3IiLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic2NpX3NwZXhwX2ZsdSIsICJzcG5fc3BleHBfd2VuIiwgIm9yZF9zcGV4cF9tdWciLCAic2NpX3NwZXhwX3BhciIsICJmaWNfc3BleHBfc3BkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAic2NpX3NwZXhwX2NuYyIsICJzcG5fc3BleHBfZ29kIiwgIm9yZF9zcGV4cF90YmwiLCAic3BuX3NwZXhwX29rdyIsICJmaWNfc3BleHBfcmFtIiksCiAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfbWFwcGluZyA9IGMoInNjaV9zcGV4cF9mbHUiID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX3NwZXhwX3dlbiIgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9zcGV4cF9tdWciID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9zcGV4cF9wYXIiID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX3NwZXhwX3NwZCIgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9zcGV4cF9jbmMiID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3BuX3NwZXhwX2dvZCIgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZF9zcGV4cF90YmwiID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9zcGV4cF9va3ciID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfc3BleHBfcmFtIiA9ICJGaWN0aW9uYWwiKSwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbjogQ2FuIF9fIGJlIGV4cGVyaWVuY2VkIGJ5IGFueW9uZSBvciBvbmx5IGJ5IHNwZWNpZmljIHBlb3BsZT8iCiAgICAgICAgICAgICAgICAgKQpgYGAKCiMjIyBQZXJ1CgpgYGB7cn0KIyBWZXJzaW9uIDEgLS0gMjEgcGFydGljaXBhbnRzCnNwZXhwX3N0YWNrZWRfYmFyKGNvdW50cnkgPSAiUGVydSIsIHZlcnNpb24gPSAxLCAKICAgICAgICAgICAgICAgICBjb2xzID0gYygic3BuX3NwZXhwX3lzaCIsICJzY2lfc3BleHBfcGFyIiwgInNwbl9zcGV4cF9nb2QiLCAib3JkX3NwZXhwX3RibCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfc3BleHBfbmp0IiwgInNwbl9zcGV4cF9jaGEiLCAic2NpX3NwZXhwX2NuYyIpLCAKICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzcG5fc3BleHBfeXNoIiA9ICJNYWh1YSBZb3NoaW5cbihiYWQgc3Bpcml0KSIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9zcGV4cF9wYXIiID0gIkludGVzdGluYWwgUGFyYXNpdGVzIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAic3BuX3NwZXhwX2dvZCIgPSAiR29kIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAib3JkX3NwZXhwX3RibCIgPSAiVGFibGVzIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAiZmljX3NwZXhwX25qdCIgPSAiTmluamEgVHVydGxlcyIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInNwbl9zcGV4cF9jaGEiID0gIkNoYWlrb25pXG4oaW52aXNpYmxlIG1hZ2ljIGh1bWFucykiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfc3BleHBfY25jIiA9ICJDYW5jZXIiKSwgCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUGVydXZpYW4gQW1hem9uIFYxOiBDYW4gX18gYmUgZXhwZXJpZW5jZWQgYnkgYW55b25lIG9yIG9ubHkgYnkgc3BlY2lmaWMgcGVvcGxlPyIpCgojIFZlcnNpb24gMiAtLSAxOSBwYXJ0aWNpcGFudHMKc3BleHBfc3RhY2tlZF9iYXIoY291bnRyeSA9ICJQZXJ1IiwgdmVyc2lvbiA9IDIsIAogICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJzY2lfc3BleHBfZ3JtIiwgIm5hc19zcGV4cF9yb24iLCAib3JkX3NwZXhwX3RheiIsICJzcG5fc3BleHBfb25pIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19zcGV4cF9zbW4iLCAibmFzX3NwZXhwX2RscCIpLCAKICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzY2lfc3BleHBfZ3JtIiA9ICJHZXJtcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAibmFzX3NwZXhwX3JvbiIgPSAiUm9uaW5cbihBbmFjb25kYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkX3NwZXhwX3RheiIgPSAiQ29mZmVlIE11ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fc3BleHBfb25pIiA9ICJPbmkgSWJvXG4oZ29vZCBzcGlyaXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19zcGV4cF9zbW4iID0gIlN1cGVybWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hc19zcGV4cF9kbHAiID0gIkpvc2hpbiBLb2tvc2hrYVxuKHBpbmsgcml2ZXIgZG9scGhpbikiKSwgCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUGVydXZpYW4gQW1hem9uIFYyOiBDYW4gX18gYmUgZXhwZXJpZW5jZWQgYnkgYW55b25lIG9yIG9ubHkgYnkgc3BlY2lmaWMgcGVvcGxlPyIpCgojIEJvdGggdmVyc2lvbnMgdG9nZXRoZXIKc3BleHBfYnlfY2F0ZWdvcnkoY291bnRyeSA9ICJQZXJ1IiwgCiAgICAgICAgICAgICAgICAgY29scyA9IGMoInNwbl9zcGV4cF95c2giLCAic2NpX3NwZXhwX3BhciIsICJzcG5fc3BleHBfZ29kIiwgIm9yZF9zcGV4cF90YmwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAiZmljX3NwZXhwX25qdCIsICJzcG5fc3BleHBfY2hhIiwgInNjaV9zcGV4cF9jbmMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfc3BleHBfZ3JtIiwgIm5hc19zcGV4cF9yb24iLCAib3JkX3NwZXhwX3RheiIsICJzcG5fc3BleHBfb25pIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZpY19zcGV4cF9zbW4iLCAibmFzX3NwZXhwX2RscCIpLAogICAgICAgICAgICAgICAgIGNhdGVnb3J5X21hcHBpbmcgPSBjKCJzcG5fc3BleHBfeXNoIiA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfc3BleHBfcGFyIiA9ICJTY2llbnRpZmljIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAic3BuX3NwZXhwX2dvZCIgPSAiU3VwZXJuYXR1cmFsIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAib3JkX3NwZXhwX3RibCIgPSAiT3JkaW5hcnkiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJmaWNfc3BleHBfbmp0IiA9ICJGaWN0aW9uYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fc3BleHBfY2hhIiA9ICJTdXBlcm5hdHVyYWwiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJzY2lfc3BleHBfY25jIiA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgInNjaV9zcGV4cF9ncm0iID0gIlNjaWVudGlmaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIm5hc19zcGV4cF9yb24iID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvcmRfc3BleHBfdGF6IiA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzcG5fc3BleHBfb25pIiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZmljX3NwZXhwX3NtbiIgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hc19zcGV4cF9kbHAiID0gIlN1cGVybmF0dXJhbCIpLAogICAgICAgICAgICAgICAgIHRpdGxlID0gIlBlcnV2aWFuIEFtYXpvbjogQ2FuIF9fIGJlIGV4cGVyaWVuY2VkIGJ5IGFueW9uZSBvciBvbmx5IGJ5IHNwZWNpZmljIHBlb3BsZT8iCiAgICAgICAgICAgICAgICAgKQpgYGAKCiMjIENhbiBYIGJlIHNlbnNlZD8KCiMjIyBVUwoKYGBge3J9CiMgSnVzdCB2ZXJzaW9uIDEgcXVlc3Rpb25zLS10aGVyZSBhcmUgMjEgcGFydGljaXBhbnRzCmV4aXN0X2Jhcihjb3VudHJ5ID0gIlVTIiwgdmVyc2lvbiA9IDEsIAogICAgICAgICAgY29scyA9IGMoInNlbnNfZ3JtIiwgInNlbnNfZGVtIiwgInNlbnNfbXVnIiwgInNlbnNfZ3Z0IiwgInNlbnNfc21uIiksIAogICAgICAgICAgY29sX25hbWVzID0gYygic2Vuc19ncm0iID0gIkdlcm1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfZGVtIiA9ICJEZW1vbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19tdWciID0gIkNvZmZlZSBNdWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfZ3Z0IiA9ICJHcmF2aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfc21uIiA9ICJTdXBlcm1hbiIpLCAKICAgICAgICAgIHRpdGxlID0gIlVTIFZlcnNpb24gMS0tQ2FuIF9fIGJlIHNlbnNlZD8iLCAKICAgICAgICAgIGRhdGEgPSBkZl9zZW5zKQoKCiMgVmVyc2lvbiAyIC0tIDI4IHBhcnRpY2lwYW50cwpleGlzdF9iYXIoY291bnRyeSA9ICJVUyIsIHZlcnNpb24gPSAyLCAKICAgICAgICAgIGNvbHMgPSBjKCJzZW5zX2NuYyIsICJzZW5zX2dvZCIsICJzZW5zX3RibCIsICJzZW5zX2docyIsICJzZW5zX2hhcCIpLCAKICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNlbnNfY25jIiA9ICJDYW5jZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19nb2QiID0gIkdvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX3RibCIgPSAiVGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfZ2hzIiA9ICJHaG9zdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19oYXAiID0gIkhhcnJ5IFBvdHRlciIpLCAKICAgICAgICAgIHRpdGxlID0gIlVTIFZlcnNpb24gMi0tQ2FuIF9fIGJlIHNlbnNlZD8iLCAKICAgICAgICAgIGRhdGEgPSBkZl9zZW5zKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIEJPVEggVkVSU0lPTlMgQ09NQklORUQgQlkgUVVFU1RJT04gVFlQRSAKdXNfc2Vuc19jb21iaW5lZCA8LSBkZl9zZW5zICU+JQogIGZpbHRlcihvbnRfY3RyeV9uYW1lID09ICJVUyIpICU+JQogIHNlbGVjdChzZW5zX2dybSwgc2Vuc19kZW0sIHNlbnNfbXVnLCBzZW5zX2d2dCwgc2Vuc19zbW4sCiAgICAgICAgIHNlbnNfY25jLCBzZW5zX2dvZCwgc2Vuc190YmwsIHNlbnNfZ2hzLCBzZW5zX2hhcCkgJT4lCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLm51bWVyaWMpKSAlPiUKICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJxdWVzdGlvbiIsIHZhbHVlc190byA9ICJyZXNwb25zZSIpICU+JQogIG11dGF0ZSgKICAgIHF1ZXN0aW9uX3R5cGUgPSByZWNvZGUocXVlc3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfZ3JtID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2d2dCA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19jbmMgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfbXVnID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc190YmwgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2dvZCA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2RlbSA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2docyA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2hhcCA9ICJGaWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3NtbiA9ICJGaWN0aW9uYWwiKQogICkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZXNwb25zZSkpICU+JQogIGdyb3VwX2J5KHF1ZXN0aW9uX3R5cGUpICU+JQogIHN1bW1hcmlzZSgKICAgIHllc19jb3VudCA9IHN1bShyZXNwb25zZSA9PSAxKSwKICAgIHRvdGFsX2NvdW50ID0gbigpLAogICAgcHJvcG9ydGlvbl95ZXMgPSB5ZXNfY291bnQgLyB0b3RhbF9jb3VudAogICkgJT4lCiAgYXJyYW5nZShkZXNjKHByb3BvcnRpb25feWVzKSkgICMgT3JkZXIgYnkgcHJvcG9ydGlvbgoKIyBDcmVhdGUgYmFyIHBsb3QKdXNfc2Vuc19jb21iaW5lZCAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3R5cGUsIC1wcm9wb3J0aW9uX3llcyksIHkgPSBwcm9wb3J0aW9uX3llcywgZmlsbCA9IHF1ZXN0aW9uX3R5cGUpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAgIyBSZW1vdmVzIHRoZSBsZWdlbmQKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3BvcnRpb25feWVzLCBhY2N1cmFjeSA9IDEpKSwgICMgQWRkIHRleHQgb24gdGhlIGJhcnMKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDUpICsgICMgQWRqdXN0IHRleHQgYXBwZWFyYW5jZQogIGxhYnMoCiAgICB0aXRsZSA9ICJVUzogQ2FuIF9fIGJlIHNlbnNlZD8tLVByb3BvcnRpb24gb2YgJ1llcycgUmVzcG9uc2VzIGJ5IFF1ZXN0aW9uIFR5cGUiLAogICAgeCA9ICJRdWVzdGlvbiBUeXBlIiwKICAgIHkgPSAiUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMiKQpgYGAKCiMjIyBHaGFuYSAKCmBgYHtyfQojIFZlcnNpb24gMSAtLSAzNSBwYXJ0aWNpcGFudHMKZXhpc3RfYmFyKGNvdW50cnkgPSAiR2hhbmEiLCB2ZXJzaW9uID0gMSwgCiAgICAgICAgICBjb2xzID0gYygic2Vuc19ncm0iLCAic2Vuc19kZW0iLCAic2Vuc19tdWciLCAic2Vuc19mcmMiLCAic2Vuc19zbW4iKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzZW5zX2dybSIgPSAiR2VybXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19kZW0iID0gIkRlbW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX211ZyIgPSAiQ29mZmVlIE11Z3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19mcmMiID0gIkZvcmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfc21uIiA9ICJTdXBlcm1hbiIpLCAKICAgICAgICAgIHRpdGxlID0gIkdoYW5hIFZlcnNpb24gMS0tQ2FuIF9fIGJlIHNlbnNlZD8iLCAKICAgICAgICAgIGRhdGEgPSBkZl9zZW5zKQoKIyBWZXJzaW9uIDIgLS0gMzUgcGFydGljaXBhbnRzCmV4aXN0X2Jhcihjb3VudHJ5ID0gIkdoYW5hIiwgdmVyc2lvbiA9IDIsIAogICAgICAgICAgY29scyA9IGMoInNlbnNfY25jIiwgInNlbnNfZ29kIiwgInNlbnNfdGJsIiwgInNlbnNfYWJzIiwgInNlbnNfa3drIiksIAogICAgICAgICAgY29sX25hbWVzID0gYygic2Vuc19jbmMiID0gIkNhbmNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX2dvZCIgPSAiR29kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfdGJsIiA9ICJUYWJsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19hYnMiID0gIkFib3NvbSAoc21hbGwgZ29kKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX2t3ayIgPSAiS3dla3UgQW5hbnNlIChmaWMuIGNoYXIuKSIpLCAKICAgICAgICAgIHRpdGxlID0gIkdoYW5hIFZlcnNpb24gMi0tQ2FuIF9fIGJlIHNlbnNlZD8iLCAKICAgICAgICAgIGRhdGEgPSBkZl9zZW5zKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyMgQk9USCBWRVJTSU9OUyBDT01CSU5FRCBCWSBRVUVTVElPTiBUWVBFIApnaF9zZW5zX2NvbWJpbmVkIDwtIGRmX3NlbnMgJT4lCiAgZmlsdGVyKG9udF9jdHJ5X25hbWUgPT0gIkdoYW5hIikgJT4lCiAgc2VsZWN0KHNlbnNfZ3JtLCBzZW5zX2RlbSwgc2Vuc19tdWcsIHNlbnNfZnJjLCBzZW5zX3NtbiwKICAgICAgICAgc2Vuc19jbmMsIHNlbnNfZ29kLCBzZW5zX3RibCwgc2Vuc19hYnMsIHNlbnNfa3drKSAlPiUKICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMubnVtZXJpYykpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gInF1ZXN0aW9uIiwgdmFsdWVzX3RvID0gInJlc3BvbnNlIikgJT4lCiAgbXV0YXRlKAogICAgcXVlc3Rpb25fdHlwZSA9IHJlY29kZShxdWVzdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19ncm0gPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfZnJjID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2NuYyA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19tdWcgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3RibCA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfZ29kID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfZGVtID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfYWJzID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfa3drID0gIkZpY3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfc21uID0gIkZpY3Rpb25hbCIpCiAgKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSkgJT4lCiAgZ3JvdXBfYnkocXVlc3Rpb25fdHlwZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgeWVzX2NvdW50ID0gc3VtKHJlc3BvbnNlID09IDEpLAogICAgdG90YWxfY291bnQgPSBuKCksCiAgICBwcm9wb3J0aW9uX3llcyA9IHllc19jb3VudCAvIHRvdGFsX2NvdW50CiAgKSAlPiUKICBhcnJhbmdlKGRlc2MocHJvcG9ydGlvbl95ZXMpKSAgIyBPcmRlciBieSBwcm9wb3J0aW9uCgojIENyZWF0ZSBiYXIgcGxvdApnaF9zZW5zX2NvbWJpbmVkICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdHlwZSwgLXByb3BvcnRpb25feWVzKSwgeSA9IHByb3BvcnRpb25feWVzLCBmaWxsID0gcXVlc3Rpb25fdHlwZSkpICsKICBnZW9tX2NvbCh3aWR0aCA9IDAuOCkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArICAjIFJlbW92ZXMgdGhlIGxlZ2VuZAogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocHJvcG9ydGlvbl95ZXMsIGFjY3VyYWN5ID0gMSkpLCAgIyBBZGQgdGV4dCBvbiB0aGUgYmFycwogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gNSkgKyAgIyBBZGp1c3QgdGV4dCBhcHBlYXJhbmNlCiAgbGFicygKICAgIHRpdGxlID0gIkdoYW5hOiBDYW4gX18gYmUgc2Vuc2VkPy0tUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMgYnkgUXVlc3Rpb24gVHlwZSIsCiAgICB4ID0gIlF1ZXN0aW9uIFR5cGUiLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mICdZZXMnIFJlc3BvbnNlcyIpCmBgYAoKIyMjIEVjdWFkb3IKCmBgYHtyfQojIFZlcnNpb24gMSAtLSAxMCBwYXJ0aWNpcGFudHMgCmV4aXN0X2Jhcihjb3VudHJ5ID0gIkVjdWFkb3IiLCB2ZXJzaW9uID0gMSwgCiAgICAgICAgICBjb2xzID0gYygic2Vuc19mbHUiLCAic2Vuc193ZW4iLCAic2Vuc19tdWciLCAic2Vuc19wYXIiLCAic2Vuc19zcGQiKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzZW5zX2ZsdSIgPSAiRGFpY2F3byAoZmx1KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX3dlbiIgPSAiV2VuZSAoZGVtb24vZm9yZXN0IGdvZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19tdWciID0gIkNvZmZlZSBNdWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfcGFyIiA9ICJJbnRlc3RpbmFsIFBhcmFzaXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX3NwZCIgPSAiU3BpZGVybWFuIiksIAogICAgICAgICAgdGl0bGUgPSAiRWN1YWRvcmlhbiBBbWF6b24gVmVyc2lvbiAxLS1DYW4gX18gYmUgc2Vuc2VkPyIsIAogICAgICAgICAgZGF0YSA9IGRmX3NlbnMpCgojIFZlcnNpb24gMiAtLSAxMCBwYXJ0aWNpcGFudHMKZXhpc3RfYmFyKGNvdW50cnkgPSAiRWN1YWRvciIsIHZlcnNpb24gPSAyLCAKICAgICAgICAgIGNvbHMgPSBjKCJzZW5zX2NuYyIsICJzZW5zX2dvZCIsICJzZW5zX3RibCIsICJzZW5zX29rdyIsICJzZW5zX3JhbSIpLCAKICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNlbnNfY25jIiA9ICJDYW5jZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19nb2QiID0gIkdvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX3RibCIgPSAiVGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfb2t3IiA9ICJPbm9rYXdhIChnaG9zdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19yYW0iID0gIlJhbWJvIiksIAogICAgICAgICAgdGl0bGUgPSAiRWN1YWRvcmlhbiBBbWF6b24gVmVyc2lvbiAyLS1DYW4gX18gYmUgc2Vuc2VkPyIsIAogICAgICAgICAgZGF0YSA9IGRmX3NlbnMpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIyBCT1RIIFZFUlNJT05TIENPTUJJTkVEIEJZIFFVRVNUSU9OIFRZUEUgCmVjX3NlbnNfY29tYmluZWQgPC0gZGZfc2VucyAlPiUKICBmaWx0ZXIob250X2N0cnlfbmFtZSA9PSAiRWN1YWRvciIpICU+JQogIHNlbGVjdChzZW5zX2ZsdSwgc2Vuc193ZW4sIHNlbnNfbXVnLCBzZW5zX3Bhciwgc2Vuc19zcGQsCiAgICAgICAgIHNlbnNfY25jLCBzZW5zX2dvZCwgc2Vuc190YmwsIHNlbnNfb2t3LCBzZW5zX3JhbSkgJT4lCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLm51bWVyaWMpKSAlPiUKICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJxdWVzdGlvbiIsIHZhbHVlc190byA9ICJyZXNwb25zZSIpICU+JQogIG11dGF0ZSgKICAgIHF1ZXN0aW9uX3R5cGUgPSByZWNvZGUocXVlc3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfZmx1ID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3BhciA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19jbmMgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfbXVnID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc190YmwgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2dvZCA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3dlbiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX29rdyA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3NwZCA9ICJGaWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3JhbSA9ICJGaWN0aW9uYWwiKQogICkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZXNwb25zZSkpICU+JQogIGdyb3VwX2J5KHF1ZXN0aW9uX3R5cGUpICU+JQogIHN1bW1hcmlzZSgKICAgIHllc19jb3VudCA9IHN1bShyZXNwb25zZSA9PSAxKSwKICAgIHRvdGFsX2NvdW50ID0gbigpLAogICAgcHJvcG9ydGlvbl95ZXMgPSB5ZXNfY291bnQgLyB0b3RhbF9jb3VudAogICkgJT4lCiAgYXJyYW5nZShkZXNjKHByb3BvcnRpb25feWVzKSkgICMgT3JkZXIgYnkgcHJvcG9ydGlvbgoKIyBDcmVhdGUgYmFyIHBsb3QKZWNfc2Vuc19jb21iaW5lZCAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3R5cGUsIC1wcm9wb3J0aW9uX3llcyksIHkgPSBwcm9wb3J0aW9uX3llcywgZmlsbCA9IHF1ZXN0aW9uX3R5cGUpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAgIyBSZW1vdmVzIHRoZSBsZWdlbmQKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3BvcnRpb25feWVzLCBhY2N1cmFjeSA9IDEpKSwgICMgQWRkIHRleHQgb24gdGhlIGJhcnMKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDUpICsgICMgQWRqdXN0IHRleHQgYXBwZWFyYW5jZQogIGxhYnMoCiAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbjpDYW4gX18gYmUgc2Vuc2VkPy0tUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMgYnkgUXVlc3Rpb24gVHlwZSIsCiAgICB4ID0gIlF1ZXN0aW9uIFR5cGUiLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mICdZZXMnIFJlc3BvbnNlcyIpCmBgYAoKIyMjIFBlcnUKCmBgYHtyfQojIFZlcnNpb24gMSAtLSAyMSBwYXJ0aWNpcGFudHMKZXhpc3RfYmFyKGNvdW50cnkgPSAiUGVydSIsIHZlcnNpb24gPSAxLCAKICAgICAgICAgIGNvbHMgPSBjKCJzZW5zX3lzaCIsICJzZW5zX3BhciIsICJzZW5zX2dvZCIsICJzZW5zX3RibCIsICJzZW5zX25qdCIsICJzZW5zX2NoYSIsICJzZW5zX2NuYyIpLCAKICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInNlbnNfeXNoIiA9ICJNYWh1YSBZb3NoaW5cbihiYWQgc3Bpcml0KSIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfcGFyIiA9ICJJbnRlc3RpbmFsIFBhcmFzaXRlcyIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfZ29kIiA9ICJHb2QiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX3RibCIgPSAiVGFibGVzIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19uanQiID0gIk5pbmphIFR1cnRsZXMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX2NoYSIgPSAiQ2hhaWtvbmlcbihpbnZpc2libGUgbWFnaWMgaHVtYW5zKSIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfY25jIiA9ICJDYW5jZXIiKSwgCiAgICAgICAgICB0aXRsZSA9ICJQZXJ1dmlhbiBBbWF6b24gVmVyc2lvbiAxLS1DYW4gX18gYmUgc2Vuc2VkPyIsIAogICAgICAgICAgZGF0YSA9IGRmX3NlbnMpCgoKIyBWZXJzaW9uIDIgLS0gMTkgcGFydGljaXBhbnRzCmV4aXN0X2Jhcihjb3VudHJ5ID0gIlBlcnUiLCB2ZXJzaW9uID0gMiwgCiAgICAgICAgICBjb2xzID0gYygic2Vuc19ncm0iLCAic2Vuc19yb24iLCAic2Vuc190YXoiLCAic2Vuc19vbmkiLCAic2Vuc19zbW4iLCAic2Vuc19kbHAiKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJzZW5zX2dybSIgPSAiR2VybXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNfcm9uIiA9ICJSb25pblxuKEFuYWNvbmRhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX3RheiIgPSAiQ29mZmVlIE11ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX29uaSIgPSAiT25pIElib1xuKGdvb2Qgc3Bpcml0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zX3NtbiIgPSAiU3VwZXJtYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc19kbHAiID0gIkpvc2hpbiBLb2tvc2hrYVxuKHBpbmsgcml2ZXIgZG9scGhpbikiKSwgCiAgICAgICAgICB0aXRsZSA9ICJQZXJ1dmlhbiBBbWF6b24gVmVyc2lvbiAyLS1DYW4gX18gYmUgc2Vuc2VkPyIsIAogICAgICAgICAgZGF0YSA9IGRmX3NlbnMpCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBCT1RIIFZFUlNJT05TIENPTUJJTkVECgpwZXJ1X3NlbnNfY29tYmluZWQgPC0gZGZfc2VucyAlPiUKICBmaWx0ZXIob250X2N0cnlfbmFtZSA9PSAiUGVydSIpICU+JQogIHNlbGVjdChzZW5zX3lzaCwgc2Vuc19wYXIsIHNlbnNfZ29kLCBzZW5zX3RibCwgc2Vuc19uanQsIHNlbnNfY2hhLCBzZW5zX2NuYywKICAgICAgICAgc2Vuc19ncm0sIHNlbnNfcm9uLCBzZW5zX3Rheiwgc2Vuc19vbmksIHNlbnNfc21uLCBzZW5zX2RscCkgJT4lCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLm51bWVyaWMpKSAlPiUKICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJxdWVzdGlvbiIsIHZhbHVlc190byA9ICJyZXNwb25zZSIpICU+JQogIG11dGF0ZSgKICAgIHF1ZXN0aW9uX3R5cGUgPSByZWNvZGUocXVlc3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfcGFyID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2NuYyA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19ncm0gPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNfdGF6ID0gIk9yZGluYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc190YmwgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3lzaCA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2dvZCA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX2NoYSA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX3JvbiA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zX29uaSA9ICJTdXBlcm5hdHVyYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19kbHAgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19uanQgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc19zbW4gPSAiRmljdGlvbmFsIikKICApICU+JQogIGZpbHRlcighaXMubmEocmVzcG9uc2UpKSAlPiUKICBncm91cF9ieShxdWVzdGlvbl90eXBlKSAlPiUKICBzdW1tYXJpc2UoCiAgICB5ZXNfY291bnQgPSBzdW0ocmVzcG9uc2UgPT0gMSksCiAgICB0b3RhbF9jb3VudCA9IG4oKSwKICAgIHByb3BvcnRpb25feWVzID0geWVzX2NvdW50IC8gdG90YWxfY291bnQKICApICU+JQogIGFycmFuZ2UoZGVzYyhwcm9wb3J0aW9uX3llcykpICAjIE9yZGVyIGJ5IHByb3BvcnRpb24KCiMgQ3JlYXRlIGJhciBwbG90CnBlcnVfc2Vuc19jb21iaW5lZCAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3R5cGUsIC1wcm9wb3J0aW9uX3llcyksIHkgPSBwcm9wb3J0aW9uX3llcywgZmlsbCA9IHF1ZXN0aW9uX3R5cGUpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAgIyBSZW1vdmVzIHRoZSBsZWdlbmQKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3BvcnRpb25feWVzLCBhY2N1cmFjeSA9IDEpKSwgICMgQWRkIHRleHQgb24gdGhlIGJhcnMKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDUpICsgICMgQWRqdXN0IHRleHQgYXBwZWFyYW5jZQogIGxhYnMoCiAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbjpDYW4gX18gYmUgc2Vuc2VkPy0tUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMgYnkgUXVlc3Rpb24gVHlwZSIsCiAgICB4ID0gIlF1ZXN0aW9uIFR5cGUiLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mICdZZXMnIFJlc3BvbnNlcyIpCmBgYAoKIyMgSGF2ZSB5b3UgZXZlciBzZW5zZWQgWD8gCgojIyMgVVMKCmBgYHtyfQojIEp1c3QgdmVyc2lvbiAxIHF1ZXN0aW9ucy0tdGhlcmUgYXJlIDIxIHBhcnRpY2lwYW50cwpleGlzdF9iYXIoY291bnRyeSA9ICJVUyIsIHZlcnNpb24gPSAxLCAKICAgICAgICAgIGNvbHMgPSBjKCJ1c2Vuc19ncm0iLCAidXNlbnNfZGVtIiwgInVzZW5zX211ZyIsICJ1c2Vuc19ndnQiLCAidXNlbnNfc21uIiksIAogICAgICAgICAgY29sX25hbWVzID0gYygidXNlbnNfZ3JtIiA9ICJHZXJtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vuc19kZW0iID0gIkRlbW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vuc19tdWciID0gIkNvZmZlZSBNdWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX2d2dCIgPSAiR3Jhdml0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vuc19zbW4iID0gIlN1cGVybWFuIiksIAogICAgICAgICAgdGl0bGUgPSAiVVMgVmVyc2lvbiAxLS1IYXZlIHlvdSBldmVyIHNlbnNlZCBfXz8iLCAKICAgICAgICAgIGRhdGEgPSBkZl91c2VucykKCgojIFZlcnNpb24gMiAtLSAyOCBwYXJ0aWNpcGFudHMKZXhpc3RfYmFyKGNvdW50cnkgPSAiVVMiLCB2ZXJzaW9uID0gMiwgCiAgICAgICAgICBjb2xzID0gYygidXNlbnNfY25jIiwgInVzZW5zX2dvZCIsICJ1c2Vuc190YmwiLCAidXNlbnNfZ2hzIiwgInVzZW5zX2hhcCIpLCAKICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInVzZW5zX2NuYyIgPSAiQ2FuY2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX2dvZCIgPSAiR29kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX3RibCIgPSAiVGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX2docyIgPSAiR2hvc3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX2hhcCIgPSAiSGFycnkgUG90dGVyIiksIAogICAgICAgICAgdGl0bGUgPSAiVVMgVmVyc2lvbiAyLS1IYXZlIHlvdSBldmVyIHNlbnNlZCBfXz8iLCAKICAgICAgICAgIGRhdGEgPSBkZl91c2VucykKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIyBCT1RIIFZFUlNJT05TIENPTUJJTkVEIEJZIFFVRVNUSU9OIFRZUEUgCnVzX3VzZW5zX2NvbWJpbmVkIDwtIGRmX3VzZW5zICU+JQogIGZpbHRlcihvbnRfY3RyeV9uYW1lID09ICJVUyIpICU+JQogIHNlbGVjdCh1c2Vuc19ncm0sIHVzZW5zX2RlbSwgdXNlbnNfbXVnLCB1c2Vuc19ndnQsIHVzZW5zX3NtbiwKICAgICAgICAgdXNlbnNfY25jLCB1c2Vuc19nb2QsIHVzZW5zX3RibCwgdXNlbnNfZ2hzLCB1c2Vuc19oYXApICU+JQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5udW1lcmljKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAicXVlc3Rpb24iLCB2YWx1ZXNfdG8gPSAicmVzcG9uc2UiKSAlPiUKICBtdXRhdGUoCiAgICBxdWVzdGlvbl90eXBlID0gcmVjb2RlKHF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19ncm0gPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2d2dCA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfY25jID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19tdWcgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc190YmwgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19nb2QgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfZGVtID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2docyA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19oYXAgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfc21uID0gIkZpY3Rpb25hbCIpCiAgKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSkgJT4lCiAgZ3JvdXBfYnkocXVlc3Rpb25fdHlwZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgeWVzX2NvdW50ID0gc3VtKHJlc3BvbnNlID09IDEpLAogICAgdG90YWxfY291bnQgPSBuKCksCiAgICBwcm9wb3J0aW9uX3llcyA9IHllc19jb3VudCAvIHRvdGFsX2NvdW50CiAgKSAlPiUKICBhcnJhbmdlKGRlc2MocHJvcG9ydGlvbl95ZXMpKSAgIyBPcmRlciBieSBwcm9wb3J0aW9uCgojIENyZWF0ZSBiYXIgcGxvdAp1c191c2Vuc19jb21iaW5lZCAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3R5cGUsIC1wcm9wb3J0aW9uX3llcyksIHkgPSBwcm9wb3J0aW9uX3llcywgZmlsbCA9IHF1ZXN0aW9uX3R5cGUpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAgIyBSZW1vdmVzIHRoZSBsZWdlbmQKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3BvcnRpb25feWVzLCBhY2N1cmFjeSA9IDEpKSwgICMgQWRkIHRleHQgb24gdGhlIGJhcnMKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDUpICsgICMgQWRqdXN0IHRleHQgYXBwZWFyYW5jZQogIGxhYnMoCiAgICB0aXRsZSA9ICJVUzogSGF2ZSB5b3UgZXZlciBzZW5zZWQgX18/LS1Qcm9wb3J0aW9uIG9mICdZZXMnIFJlc3BvbnNlcyBieSBRdWVzdGlvbiBUeXBlIiwKICAgIHggPSAiUXVlc3Rpb24gVHlwZSIsCiAgICB5ID0gIlByb3BvcnRpb24gb2YgJ1llcycgUmVzcG9uc2VzIikKYGBgCgojIyMgR2hhbmEgCgpgYGB7cn0KIyBWZXJzaW9uIDEgLS0gMzUgcGFydGljaXBhbnRzCmV4aXN0X2Jhcihjb3VudHJ5ID0gIkdoYW5hIiwgdmVyc2lvbiA9IDEsIAogICAgICAgICAgY29scyA9IGMoInVzZW5zX2dybSIsICJ1c2Vuc19kZW0iLCAidXNlbnNfbXVnIiwgInVzZW5zX2ZyYyIsICJ1c2Vuc19zbW4iKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJ1c2Vuc19ncm0iID0gIkdlcm1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX2RlbSIgPSAiRGVtb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX211ZyIgPSAiQ29mZmVlIE11Z3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfZnJjIiA9ICJGb3JjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vuc19zbW4iID0gIlN1cGVybWFuIiksIAogICAgICAgICAgdGl0bGUgPSAiR2hhbmEgVmVyc2lvbiAxLS1IYXZlIHlvdSBldmVyIHNlbnNlZCBfXz8iLCAKICAgICAgICAgIGRhdGEgPSBkZl91c2VucykKCiMgVmVyc2lvbiAyIC0tIDM1IHBhcnRpY2lwYW50cwpleGlzdF9iYXIoY291bnRyeSA9ICJHaGFuYSIsIHZlcnNpb24gPSAyLCAKICAgICAgICAgIGNvbHMgPSBjKCJ1c2Vuc19jbmMiLCAidXNlbnNfZ29kIiwgInVzZW5zX3RibCIsICJ1c2Vuc19hYnMiLCAidXNlbnNfa3drIiksIAogICAgICAgICAgY29sX25hbWVzID0gYygidXNlbnNfY25jIiA9ICJDYW5jZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfZ29kIiA9ICJHb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfdGJsIiA9ICJUYWJsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfYWJzIiA9ICJBYm9zb20gKHNtYWxsIGdvZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfa3drIiA9ICJLd2VrdSBBbmFuc2UgKGZpYy4gY2hhci4pIiksIAogICAgICAgICAgdGl0bGUgPSAiR2hhbmEgVmVyc2lvbiAyLS1IYXZlIHlvdSBldmVyIHNlbnNlZCBfXz8iLCAKICAgICAgICAgIGRhdGEgPSBkZl91c2VucykKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIEJPVEggVkVSU0lPTlMgQ09NQklORUQgQlkgUVVFU1RJT04gVFlQRSAKZ2hfdXNlbnNfY29tYmluZWQgPC0gZGZfdXNlbnMgJT4lCiAgZmlsdGVyKG9udF9jdHJ5X25hbWUgPT0gIkdoYW5hIikgJT4lCiAgc2VsZWN0KHVzZW5zX2dybSwgdXNlbnNfZGVtLCB1c2Vuc19tdWcsIHVzZW5zX2ZyYywgdXNlbnNfc21uLAogICAgICAgICB1c2Vuc19jbmMsIHVzZW5zX2dvZCwgdXNlbnNfdGJsLCB1c2Vuc19hYnMsIHVzZW5zX2t3aykgJT4lCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLm51bWVyaWMpKSAlPiUKICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJxdWVzdGlvbiIsIHZhbHVlc190byA9ICJyZXNwb25zZSIpICU+JQogIG11dGF0ZSgKICAgIHF1ZXN0aW9uX3R5cGUgPSByZWNvZGUocXVlc3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2dybSA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfZnJjID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19jbmMgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX211ZyA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX3RibCA9ICJPcmRpbmFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2dvZCA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19kZW0gPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfYWJzID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2t3ayA9ICJGaWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19zbW4gPSAiRmljdGlvbmFsIikKICApICU+JQogIGZpbHRlcighaXMubmEocmVzcG9uc2UpKSAlPiUKICBncm91cF9ieShxdWVzdGlvbl90eXBlKSAlPiUKICBzdW1tYXJpc2UoCiAgICB5ZXNfY291bnQgPSBzdW0ocmVzcG9uc2UgPT0gMSksCiAgICB0b3RhbF9jb3VudCA9IG4oKSwKICAgIHByb3BvcnRpb25feWVzID0geWVzX2NvdW50IC8gdG90YWxfY291bnQKICApICU+JQogIGFycmFuZ2UoZGVzYyhwcm9wb3J0aW9uX3llcykpICAjIE9yZGVyIGJ5IHByb3BvcnRpb24KCiMgQ3JlYXRlIGJhciBwbG90CmdoX3VzZW5zX2NvbWJpbmVkICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdHlwZSwgLXByb3BvcnRpb25feWVzKSwgeSA9IHByb3BvcnRpb25feWVzLCBmaWxsID0gcXVlc3Rpb25fdHlwZSkpICsKICBnZW9tX2NvbCh3aWR0aCA9IDAuOCkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArICAjIFJlbW92ZXMgdGhlIGxlZ2VuZAogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocHJvcG9ydGlvbl95ZXMsIGFjY3VyYWN5ID0gMSkpLCAgIyBBZGQgdGV4dCBvbiB0aGUgYmFycwogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gNSkgKyAgIyBBZGp1c3QgdGV4dCBhcHBlYXJhbmNlCiAgbGFicygKICAgIHRpdGxlID0gIkdoYW5hOiBIYXZlIHlvdSBldmVyIHNlbnNlZCBfXz8tLVByb3BvcnRpb24gb2YgJ1llcycgUmVzcG9uc2VzIGJ5IFF1ZXN0aW9uIFR5cGUiLAogICAgeCA9ICJRdWVzdGlvbiBUeXBlIiwKICAgIHkgPSAiUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMiKQpgYGAKCiMjIyBFY3VhZG9yCgpgYGB7cn0KIyBWZXJzaW9uIDEgLS0gMTAgcGFydGljaXBhbnRzIApleGlzdF9iYXIoY291bnRyeSA9ICJFY3VhZG9yIiwgdmVyc2lvbiA9IDEsIAogICAgICAgICAgY29scyA9IGMoInVzZW5zX2ZsdSIsICJ1c2Vuc193ZW4iLCAidXNlbnNfbXVnIiwgInVzZW5zX3BhciIsICJ1c2Vuc19zcGQiKSwgCiAgICAgICAgICBjb2xfbmFtZXMgPSBjKCJ1c2Vuc19mbHUiID0gIkRhaWNhd28gKGZsdSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfd2VuIiA9ICJXZW5lIChkZW1vbi9mb3Jlc3QgZ29kKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vuc19tdWciID0gIkNvZmZlZSBNdWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX3BhciIgPSAiSW50ZXN0aW5hbCBQYXJhc2l0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfc3BkIiA9ICJTcGlkZXJtYW4iKSwgCiAgICAgICAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbiBWZXJzaW9uIDEtLUhhdmUgeW91IGV2ZXIgc2Vuc2VkIF9fPyIsIAogICAgICAgICAgZGF0YSA9IGRmX3VzZW5zKQoKIyBWZXJzaW9uIDIgLS0gMTAgcGFydGljaXBhbnRzCmV4aXN0X2Jhcihjb3VudHJ5ID0gIkVjdWFkb3IiLCB2ZXJzaW9uID0gMiwgCiAgICAgICAgICBjb2xzID0gYygidXNlbnNfY25jIiwgInVzZW5zX2dvZCIsICJ1c2Vuc190YmwiLCAidXNlbnNfb2t3IiwgInVzZW5zX3JhbSIpLCAKICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInVzZW5zX2NuYyIgPSAiQ2FuY2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX2dvZCIgPSAiR29kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX3RibCIgPSAiVGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX29rdyIgPSAiT25va2F3YSAoZ2hvc3QpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX3JhbSIgPSAiUmFtYm8iKSwgCiAgICAgICAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbiBWZXJzaW9uIDItLUhhdmUgeW91IGV2ZXIgc2Vuc2VkIF9fPyIsIAogICAgICAgICAgZGF0YSA9IGRmX3VzZW5zKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyMgQk9USCBWRVJTSU9OUyBDT01CSU5FRCBCWSBRVUVTVElPTiBUWVBFIAplY191c2Vuc19jb21iaW5lZCA8LSBkZl91c2VucyAlPiUKICBmaWx0ZXIob250X2N0cnlfbmFtZSA9PSAiRWN1YWRvciIpICU+JQogIHNlbGVjdCh1c2Vuc19mbHUsIHVzZW5zX3dlbiwgdXNlbnNfbXVnLCB1c2Vuc19wYXIsIHVzZW5zX3NwZCwKICAgICAgICAgdXNlbnNfY25jLCB1c2Vuc19nb2QsIHVzZW5zX3RibCwgdXNlbnNfb2t3LCB1c2Vuc19yYW0pICU+JQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5udW1lcmljKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAicXVlc3Rpb24iLCB2YWx1ZXNfdG8gPSAicmVzcG9uc2UiKSAlPiUKICBtdXRhdGUoCiAgICBxdWVzdGlvbl90eXBlID0gcmVjb2RlKHF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19mbHUgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX3BhciA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfY25jID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19tdWcgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc190YmwgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19nb2QgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfd2VuID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX29rdyA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19zcGQgPSAiRmljdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfcmFtID0gIkZpY3Rpb25hbCIpCiAgKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSkgJT4lCiAgZ3JvdXBfYnkocXVlc3Rpb25fdHlwZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgeWVzX2NvdW50ID0gc3VtKHJlc3BvbnNlID09IDEpLAogICAgdG90YWxfY291bnQgPSBuKCksCiAgICBwcm9wb3J0aW9uX3llcyA9IHllc19jb3VudCAvIHRvdGFsX2NvdW50CiAgKSAlPiUKICBhcnJhbmdlKGRlc2MocHJvcG9ydGlvbl95ZXMpKSAgIyBPcmRlciBieSBwcm9wb3J0aW9uCgojIENyZWF0ZSBiYXIgcGxvdAplY191c2Vuc19jb21iaW5lZCAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3R5cGUsIC1wcm9wb3J0aW9uX3llcyksIHkgPSBwcm9wb3J0aW9uX3llcywgZmlsbCA9IHF1ZXN0aW9uX3R5cGUpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAgIyBSZW1vdmVzIHRoZSBsZWdlbmQKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3BvcnRpb25feWVzLCBhY2N1cmFjeSA9IDEpKSwgICMgQWRkIHRleHQgb24gdGhlIGJhcnMKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDUpICsgICMgQWRqdXN0IHRleHQgYXBwZWFyYW5jZQogIGxhYnMoCiAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbjpIYXZlIHlvdSBldmVyIHNlbnNlZCBfXz8tLVByb3BvcnRpb24gb2YgJ1llcycgUmVzcG9uc2VzIGJ5IFF1ZXN0aW9uIFR5cGUiLAogICAgeCA9ICJRdWVzdGlvbiBUeXBlIiwKICAgIHkgPSAiUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMiKQpgYGAKCiMjIyBQZXJ1CgpgYGB7cn0KIyBWZXJzaW9uIDEgLS0gMjEgcGFydGljaXBhbnRzCmV4aXN0X2Jhcihjb3VudHJ5ID0gIlBlcnUiLCB2ZXJzaW9uID0gMSwgCiAgICAgICAgICBjb2xzID0gYygidXNlbnNfeXNoIiwgInVzZW5zX3BhciIsICJ1c2Vuc19nb2QiLCAidXNlbnNfdGJsIiwgInVzZW5zX25qdCIsICJ1c2Vuc19jaGEiLCAidXNlbnNfY25jIiksIAogICAgICAgICAgY29sX25hbWVzID0gYygidXNlbnNfeXNoIiA9ICJNYWh1YSBZb3NoaW5cbihiYWQgc3Bpcml0KSIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX3BhciIgPSAiSW50ZXN0aW5hbCBQYXJhc2l0ZXMiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vuc19nb2QiID0gIkdvZCIsICAKICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX3RibCIgPSAiVGFibGVzIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfbmp0IiA9ICJOaW5qYSBUdXJ0bGVzIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfY2hhIiA9ICJDaGFpa29uaVxuKGludmlzaWJsZSBtYWdpYyBodW1hbnMpIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfY25jIiA9ICJDYW5jZXIiKSwgCiAgICAgICAgICB0aXRsZSA9ICJQZXJ1dmlhbiBBbWF6b24gVmVyc2lvbiAxLS1IYXZlIHlvdSBldmVyIHNlbnNlZCBfXz8iLCAKICAgICAgICAgIGRhdGEgPSBkZl91c2VucykKCgojIFZlcnNpb24gMiAtLSAxOSBwYXJ0aWNpcGFudHMKZXhpc3RfYmFyKGNvdW50cnkgPSAiUGVydSIsIHZlcnNpb24gPSAyLCAKICAgICAgICAgIGNvbHMgPSBjKCJ1c2Vuc19ncm0iLCAidXNlbnNfcm9uIiwgInVzZW5zX3RheiIsICJ1c2Vuc19vbmkiLCAidXNlbnNfc21uIiwgInVzZW5zX2RscCIpLCAKICAgICAgICAgIGNvbF9uYW1lcyA9IGMoInVzZW5zX2dybSIgPSAiR2VybXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX3JvbiIgPSAiUm9uaW5cbihBbmFjb25kYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlbnNfdGF6IiA9ICJDb2ZmZWUgTXVnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX29uaSIgPSAiT25pIElib1xuKGdvb2Qgc3Bpcml0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vuc19zbW4iID0gIlN1cGVybWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZW5zX2RscCIgPSAiSm9zaGluIEtva29zaGthXG4ocGluayByaXZlciBkb2xwaGluKSIpLCAKICAgICAgICAgIHRpdGxlID0gIlBlcnV2aWFuIEFtYXpvbiBWZXJzaW9uIDItLUhhdmUgeW91IGV2ZXIgc2Vuc2VkIF9fPyIsIAogICAgICAgICAgZGF0YSA9IGRmX3VzZW5zKQoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQk9USCBWRVJTSU9OUyBDT01CSU5FRAoKcGVydV91c2Vuc19jb21iaW5lZCA8LSBkZl91c2VucyAlPiUKICBmaWx0ZXIob250X2N0cnlfbmFtZSA9PSAiUGVydSIpICU+JQogIHNlbGVjdCh1c2Vuc195c2gsIHVzZW5zX3BhciwgdXNlbnNfZ29kLCB1c2Vuc190YmwsIHVzZW5zX25qdCwgdXNlbnNfY2hhLCB1c2Vuc19jbmMsCiAgICAgICAgIHVzZW5zX2dybSwgdXNlbnNfcm9uLCB1c2Vuc190YXosIHVzZW5zX29uaSwgdXNlbnNfc21uLCB1c2Vuc19kbHApICU+JQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5udW1lcmljKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAicXVlc3Rpb24iLCB2YWx1ZXNfdG8gPSAicmVzcG9uc2UiKSAlPiUKICBtdXRhdGUoCiAgICBxdWVzdGlvbl90eXBlID0gcmVjb2RlKHF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19wYXIgPSAiU2NpZW50aWZpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2NuYyA9ICJTY2llbnRpZmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfZ3JtID0gIlNjaWVudGlmaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc190YXogPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc190YmwgPSAiT3JkaW5hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc195c2ggPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfZ29kID0gIlN1cGVybmF0dXJhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX2NoYSA9ICJTdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19yb24gPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfb25pID0gIlN1cGVybmF0dXJhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vuc19kbHAgPSAiU3VwZXJuYXR1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbnNfbmp0ID0gIkZpY3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW5zX3NtbiA9ICJGaWN0aW9uYWwiKQogICkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZXNwb25zZSkpICU+JQogIGdyb3VwX2J5KHF1ZXN0aW9uX3R5cGUpICU+JQogIHN1bW1hcmlzZSgKICAgIHllc19jb3VudCA9IHN1bShyZXNwb25zZSA9PSAxKSwKICAgIHRvdGFsX2NvdW50ID0gbigpLAogICAgcHJvcG9ydGlvbl95ZXMgPSB5ZXNfY291bnQgLyB0b3RhbF9jb3VudAogICkgJT4lCiAgYXJyYW5nZShkZXNjKHByb3BvcnRpb25feWVzKSkgICMgT3JkZXIgYnkgcHJvcG9ydGlvbgoKIyBDcmVhdGUgYmFyIHBsb3QKcGVydV91c2Vuc19jb21iaW5lZCAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3R5cGUsIC1wcm9wb3J0aW9uX3llcyksIHkgPSBwcm9wb3J0aW9uX3llcywgZmlsbCA9IHF1ZXN0aW9uX3R5cGUpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAgIyBSZW1vdmVzIHRoZSBsZWdlbmQKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3BvcnRpb25feWVzLCBhY2N1cmFjeSA9IDEpKSwgICMgQWRkIHRleHQgb24gdGhlIGJhcnMKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDUpICsgICMgQWRqdXN0IHRleHQgYXBwZWFyYW5jZQogIGxhYnMoCiAgICB0aXRsZSA9ICJFY3VhZG9yaWFuIEFtYXpvbjpIYXZlIHlvdSBldmVyIHNlbnNlZCBfXz8tLVByb3BvcnRpb24gb2YgJ1llcycgUmVzcG9uc2VzIGJ5IFF1ZXN0aW9uIFR5cGUiLAogICAgeCA9ICJRdWVzdGlvbiBUeXBlIiwKICAgIHkgPSAiUHJvcG9ydGlvbiBvZiAnWWVzJyBSZXNwb25zZXMiKQpgYGA=